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);
}
});
}
}
それは働いていますか? –
これは機能しません、ビットマップはまだメモリに保持されます –