2016-04-04 36 views
3

Picasso'yu kullanarak ScrollGalleryView'da bitmapler yüklediğim bir Etkinliğim var. Bu aktiviteden çıkıp tekrar girdiğimde bellek boşalmaz ve OutOfMemory hatası atılır.
Picasso'da .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) kullanmayı denedim ancak görüntüler hala yüklü ve bellekte tutuluyor. Ayrıca, geri düğmesine basıldığında bitmapleri geri dönüştürmeyi denedim, ancak yine de şansım olmadı.
Bu i kullanıyorum kodudur:Picasso'yu kullanarak bellekten bit eşlemleri kaldıramazsınız ve scrollGalleryView

//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); 
      } 
     }); 


    } 

} 

cevap

0

Çağrı Bu programın clearAllResources olduğunu

public void clearAllResources() { 

       // Set related variables null 

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

() içinde; aktivite başlangıcında

+0

Çalışıyor mu? –

+0

Bu çalışmıyor, bitmapler hala bellekte tutuluyor –