3

Picasaを使用してScrollGalleryViewにビットマップを読み込むアクティビティがあります。 そのアクティビティを終了して再び入力すると、メモリは空にならず、OutOfMemoryエラーがスローされます。
ピカソで.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)を使ってみましたが、イメージはまだロードされてメモリに保存されています。 バックボタンを押してもビットマップをリサイクルしようとしましたが、まだ運がありませんでした。
これは私が使用しているコードです:Picassoと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); 
      } 
     }); 


    } 

} 

答えて

0

コールこのプログラムclearAllResourcesある

public void clearAllResources() { 

       // Set related variables null 

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

を()で。活動の開始時に

+0

それは働いていますか? –

+0

これは機能しません、ビットマップはまだメモリに保持されます –

関連する問題