2016-04-04 16 views
3

Ich habe eine Aktivität, in der ich Bitmaps in einem ScrollGalleryView mit Picasso laden. Wenn ich diese Aktivität verlasse und erneut eingabe, wird der Speicher nicht geleert und ein OutOfMemory-Fehler wird ausgegeben.
Ich habe versucht, .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) in Picasso, aber die Bilder sind immer noch geladen und im Speicher gehalten. Ich habe auch versucht, die Bitmaps zu recyceln, wenn die Zurück-Taste gedrückt wird, aber ich hatte immer noch kein Glück. Dieser
ist der Code, ich verwende:Kann Bitmaps nicht aus dem Speicher mit Picasso und scrollGalleryView entfernen

//Method called in the onCreate that loads the photo in the scrollGalleryView: 
private void loadPhotos() { 
    savedImages = new ArrayList<Uri>(); 

    File file = new File(getPhotoDirectory()); 
    File[] files = file.listFiles(); 
    if (files != null) { 
     for (File f : files) { // loop and print all file 
      savedImages.add(Uri.fromFile(f)); 
     } 
    } 

    if (!savedImages.isEmpty()) { 
     for (final Uri savedImage : savedImages) { 
      if (savedImage.getLastPathSegment().contains(radiatorId)) { 
       scrollGalleryView.setVisibility(View.VISIBLE); 
       RadiatorSettingsMediaLoader mMediaLoader = new RadiatorSettingsMediaLoader(savedImage); 
       scrollGalleryView.addMedia(MediaInfo.mediaLoader(mMediaLoader)); 
      } 
     } 
    } 
} 





class RadiatorSettingsMediaLoader implements MediaLoader { 
    Uri savedImage; 

    public RadiatorSettingsMediaLoader(Uri savedImage) { 
     this.savedImage = savedImage; 
    } 

    @Override 
    public boolean isImage() { 
     return true; 
    } 

    @Override 
    public void loadMedia(final Context context, final ImageView imageView, 
          final MediaLoader.SuccessCallback callback) { 
     imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      public ViewTreeObserver.OnGlobalLayoutListener getLayoutListener() { 
       return this; 
      } 

      @Override 
      public void onGlobalLayout() { 
       Picasso.with(getApplicationContext()).load(savedImage) 
         .resize(imageView.getWidth(), (imageView.getHeight()) - 175) 
         .centerInside() 
         .placeholder(imageView.getDrawable()) 
         .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) 
         .into(imageView, new Callback() { 
          @Override 
          public void onSuccess() { 
           callback.onSuccess(); 
           imageView.setPadding(0, 0, 0, 175); 
           imageView.getViewTreeObserver().removeOnGlobalLayoutListener(getLayoutListener()); 
           Picasso.with(getApplicationContext()).invalidate(new File(savedImage.getPath())); 
          } 

          @Override 
          public void onError() { 
           Toast.makeText(context, "non sono riuscito a caricare l'immagine", Toast.LENGTH_SHORT).show(); 
           imageView.getViewTreeObserver().removeOnGlobalLayoutListener(getLayoutListener()); 
           loadMedia(context, imageView, callback); 

          } 
         }); 
       imageViewsToClear.add(imageView); 

      } 
     }); 
    } 

    @Override 
    public void loadThumbnail(final Context context, final ImageView thumbnailView, 
           final MediaLoader.SuccessCallback callback) { 


     thumbnailView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      public ViewTreeObserver.OnGlobalLayoutListener getLayoutListener() { 
       return this; 
      } 

      @Override 
      public void onGlobalLayout() { 
       Picasso.with(context) 
         .load(savedImage) 
         .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) 
         .into(thumbnailView, new Callback() { 
          @Override 
          public void onSuccess() { 

           callback.onSuccess(); 
           thumbnailView.setLongClickable(true); 
           thumbnailView.setOnLongClickListener(new View.OnLongClickListener() { 

            @Override 
            public boolean onLongClick(View v) { 
             AlertDialog.Builder builder = new AlertDialog.Builder(RadiatorSettingsActivity.this); 

             builder.setTitle(R.string.safe_delete_photo_title).setMessage(R.string.safe_delete_photo_text); 
             builder.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { 
              @Override 
              public void onClick(DialogInterface dialog, int which) { 
               File fdelete = new File(savedImage.getPath()); 
               if (fdelete.exists()) { 
                if (fdelete.delete()) { 
                 deleteFileFromMediaStore(getContentResolver(), fdelete); 
                 System.out.println("file Deleted "); 
                 finish(); 
                 startActivity(getIntent().putExtra("PhotoRemoved", true)); 
                } else { 
                 System.out.println("file not Deleted :"); 
                } 
               } 


              } 
             }); 
             builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
              @Override 
              public void onClick(DialogInterface dialog, int which) { 
               dialog.dismiss(); 
              } 
             }); 
             builder.show(); 
             return true; 
            } 
           }); 
           thumbnailView.getViewTreeObserver() 
             .removeOnGlobalLayoutListener(getLayoutListener()); 
          } 


          @Override 
          public void onError() { 
           Toast.makeText(context, "errore a caricare thumbnail", Toast.LENGTH_SHORT).show(); 
           loadThumbnail(context, thumbnailView, callback); 
           thumbnailView.getViewTreeObserver() 
             .removeOnGlobalLayoutListener(getLayoutListener()); 
          } 
         }); 

       imageViewsToClear.add(thumbnailView); 
      } 
     }); 


    } 

} 

Antwort

0

Rufen Sie diese in Ihrem Programm

public void clearAllResources() { 

       // Set related variables null 

       System.gc(); 
       Runtime.getRuntime().gc(); 
      } 

die clearAllResources ist(); am Anfang der Aktivität

+0

Funktioniert es ?? –

+0

Dies funktioniert nicht, die Bitmaps werden immer noch im Speicher gehalten –