2017-01-31 7 views
0

Ich habe ein Stück Code wie das und es funktioniert tatsächlich gut. Die einzige Sorge, die ich habe, ist, dass es Bild in base64 konvertiert, und es scheint viel Speicher zu essen.Speichern von Speicher auf Bildsynchronisation auf Android

Ich würde gerne wissen, ob es bessere Möglichkeiten gibt, es zu tun.

// SYNCING IMAGES 
    private boolean syncImages() { 
     boolean update = false; 

     for (Asset asset : assets) { 
      // Get all images for the asset (list) -> get string name of image (string) 
      List<Image> remoteAssetImages = RESTfulService.getInstance().getAssetImages(asset.getId()); 
      ArrayList<String> remoteAssetURIs = new ArrayList<>(); 
      for (Image img : remoteAssetImages) 
       remoteAssetURIs.add(img.getImageId() + ".jpg"); 

      for (String remoteURI : remoteAssetURIs) { 
       if (!asset.getImages().contains(remoteURI)) { 
        long imageId = Long.parseLong(remoteURI.replace(".jpg", "")); 
        // Perform synchronous get request 
        try { 
         Bitmap img = Picasso.with(getApplicationContext()) 
           .load("http://www.google.com/image" + imageId + "/jpg") 
           .get(); 
         saveRemoteImage(getApplicationContext(), img, imageId, asset); 
         asset.setConcatenatedImageURI(); 
         AssetDatabaseHandler.getInstance(getApplicationContext()).updateAsset(asset); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        update = true; 
       } 
      } 

      Iterator<String> uriIterator = asset.getImages().iterator(); 
      while(uriIterator.hasNext()){ 
       String uri = uriIterator.next(); 
       if (!remoteAssetURIs.contains(uri)) { 
        String base64Image = getBase64EncodedImage(getApplicationContext(), uri); 
        ImageData postImage = new ImageData(6, asset.getId(), base64Image); 
        RESTfulService.getInstance().postImage(postImage); 
        renameImageFile(getApplicationContext(), asset, uri, postImage.getImageId()+".jpg"); 
        AssetDatabaseHandler.getInstance(getApplicationContext()).updateAsset(asset); 
       } 
      } 
     } 

     return update; 
    } 

    public static void renameImageFile(Context context, Asset asset, String currentName, String newName){ 
     File originalFile = context.getFileStreamPath(currentName); 
     File newFile = new File(originalFile.getParent(), newName); 
     if (newFile.exists()) 
      context.deleteFile(newName); 
     originalFile.renameTo(newFile); 
     asset.getImages().remove(currentName); 
     asset.addImage(newName); 
     asset.setConcatenatedImageURI(); 
    } 

    public static String getBase64EncodedImage(Context context, String imagePath){ 
     Bitmap bmp = getImageBitmap(context, imagePath); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
     byte[] imageDataBytes = stream.toByteArray(); 
     return Base64.encodeToString(imageDataBytes, Base64.NO_WRAP); 
    } 

Grüße,

Antwort

0

Der Grund ist es viel Speicher frisst, weil sie die gesamte Zeichenfolge in den Speicher geladen und OOM Ausnahmen mit großen Bildern führen kann.

Wenn Sie ein Bild seiner besseren laden Sie ein Bild in Blöcken von Daten zu laden, den Speicher zu speichern und OOM Ausnahmen

+0

verhindern Können Sie näher erläutern bitte? Wie kann ich Bilder in Datenblöcke hochladen? Vielen Dank. –

+0

können Sie Google verwenden, um zu suchen, wie man das macht – tyczj

Verwandte Themen