2016-05-23 9 views
0

Gibt es eine Bibliothek oder eine effiziente Möglichkeit, mit Bitmaps umzugehen.Bitmap Speicherleck große Bilder

Ich muss 1-10 Bilder an den Server senden. Bilder sind von 3-15 Megabyte. Wir senden Zeichenfolge im Base64-Format. Aber dieser Prozess benötigt zu viel Speicher und Anwendungen explodieren. Ich habe versucht, Anwendung zu optimieren und Speicher neu zu erstellen, aber in den meisten Fällen bekam ich Speicherausnahme, auch ich benutze großen Haufen.

protected Void doInBackground(Void... voids) { 

      for (int i = 0; i < mUriList.size(); i++) { 
       Log.e("encodeImage bitmap", Integer.toString(i) + " " + mUriList.get(i)); 
       mBitmap = getBitmapFromUri(mUriList.get(i)); 
       String imageNamePath = mImageNameList.get(i); 

       // FIXME: 5/23/16 OOM kod 10 slika 

       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 

       byte[] array = stream.toByteArray(); 
       encoded_string = Base64.encodeToString(array, Base64.DEFAULT); 

       array = null; 
       //encoded_image_list.add(encoded_string); 
       makeRequest(encoded_string, imageNamePath, i); 
       mBitmap.recycle(); 
       mBitmap = null; 
       try { 
        stream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       stream = null; 
       encoded_string = null; 
       System.gc(); 
      } 
      return null; 
     }.... 

Get Bild von Bitmap

public Bitmap getBitmapFromUri(Uri uri) { 
     Bitmap bitmap = null; 
     try { 
      bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return bitmap; 
    } 

ps: ich kann die Bildqualität reduzieren!

+0

Grundsätzlich möchten Sie Base64 für den späteren Versand verwenden? –

+0

Ich konvertiere es in Base64 und sende mit Volley. Es funktioniert gut, aber manchmal habe ich Speicher Leck Ausnahme App dauert von 150 bis 650 RAM Konvertierungsprozess. Ich sende Bild in makeRequest Funktion. Ich konvertiere Bild 1 um 1 und sende sie 1 in 1 in async Aufgabe ... – Adnan

+0

können Sie die Bildgröße vor base64 reduzieren? –

Antwort

0

Nehmen wir an, Sie haben die Möglichkeit, die Anforderung auf Server-Seite neu zu schreiben, um den Image-Upload über Multipart-POST-Anfragen abzuwickeln. (Da Sie die Back-End-API auch schreiben, bestätigt!)

Ich nahm eine Probe Stück Code mit OkHttp Client hier:

public final class PostMultipart { 
    /** 
    * The imgur client ID for OkHttp recipes. If you're using imgur for anything other than running 
    * these examples, please request your own client ID! https://api.imgur.com/oauth2 
    */ 
    private static final String IMGUR_CLIENT_ID = "9199fdef135c122"; 
    private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); 

    private final OkHttpClient client = new OkHttpClient(); 

    public void run() throws Exception { 
    // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image 
    RequestBody requestBody = new MultipartBody.Builder() 
     .setType(MultipartBody.FORM) 
     .addFormDataPart("title", "Square Logo") 
     .addFormDataPart("image", "logo-square.png", 
      RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png"))) 
     .build(); 

    Request request = new Request.Builder() 
     .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID) 
     .url("https://api.imgur.com/3/image") 
     .post(requestBody) 
     .build(); 

    try (Response response = client.newCall(request).execute()) { 
     if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 

     System.out.println(response.body().string()); 
    } 
    } 

    public static void main(String... args) throws Exception { 
    new PostMultipart().run(); 
    } 
} 

Voll Probe hier auf Github OkHttp Rezepte: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/PostMultipart.java

AFAIK, Der OkHttp-Client würde die Image-Datei lesen und hochladen, da es sich um kleinere Streams handelt. Dies würde den Fall vermeiden, dass Sie das Bild als großen Speicherbereich behandeln müssen, wenn Sie als Base64-String lesen.