【发布时间】:2015-08-04 06:26:56
【问题描述】:
我已经创建了一个应用程序,其中有 gridview,当我们选择任何缩略图时,我们会在 viewpager 中看到完整尺寸的图像。但是,当我多次单击缩略图并查看图像时,我在 android 中的内存不足。我进行了很多搜索,找到了一种使用 picasso 代替 imageloader 的解决方案,但我不能使用 picasso。我只用 imageloader 来做。谁能告诉我imageloader的确切配置和选项,这样我就不会内存不足????
请帮助我尝试了许多配置更改。
public class ImagePagerAdapter extends PagerAdapter {
LayoutInflater inflater;
PhotoViewAttacher attacher;
PhotoViewAttacher pic;
private DisplayImageOptions options;
List<Image> IMAGES_LIST = AppController.getInstance().getPrefManger()
.getImages();
public ImagePagerAdapter(Context context) {
inflater = LayoutInflater.from(context);
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheOnDisc()
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
final View imageLayout = inflater.inflate(
R.layout.item_pager_image, container, false);
assert imageLayout != null;
pos = position;
imageView = (TouchImageView) imageLayout.findViewById(R.id.image);
imageView.setTag(position);
imageView.setOnDoubleTapListener(new OnDoubleTapListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
try
{
timer.cancel();
}
catch(Exception ex){}
if(IMAGES_LIST.get(position).getType().equalsIgnoreCase("image"))
{
mHandler.removeCallbacks(r);
share.setVisibility(View.VISIBLE);
play.setVisibility(View.VISIBLE);
done.setVisibility(View.VISIBLE);
if (!isCopyImage.equals("yes")) {
gimmy.setVisibility(View.VISIBLE);
}
comment.setVisibility(View.VISIBLE);
count.setVisibility(View.VISIBLE);
caption.setVisibility(View.VISIBLE);
mHandler.postDelayed(r, 5 * 1000);
}
else{
mHandler.removeCallbacks(r);
done.setVisibility(View.VISIBLE);
mHandler.postDelayed(r, 5 * 1000);
}
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
Log.i("hello", "");
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
});
try{
final ProgressBar spinner = (ProgressBar) imageLayout
.findViewById(R.id.loading);
final ImageView videoplay = (ImageView) imageLayout
.findViewById(R.id.play);
if(IMAGES_LIST.get(position).getType().equalsIgnoreCase("image"))
{
videoplay.setVisibility(View.INVISIBLE);
ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(container.getContext());
config.memoryCache(new WeakMemoryCache());
config.denyCacheImageMultipleSizesInMemory();
config.discCache(new UnlimitedDiskCache(container.getContext().getCacheDir()));
imageLoader=ImageLoader.getInstance();
imageLoader.init(config.build());
imageLoader.displayImage(
AppConst.BASE_IMAGE_URL
+ IMAGES_LIST.get(position).getFileName(),
imageView, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
spinner.setVisibility(View.VISIBLE);
view.setVisibility(View.GONE);
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri,
View view, Bitmap loadedImage) {
spinner.setVisibility(View.GONE);
view.setVisibility(View.VISIBLE);
}
});
container.addView(imageLayout, 0);
}
【问题讨论】:
-
我使用 imageloader 而不是位图从 url 加载图像,所以你给出的这两个链接不能被使用
-
如果你想要一个答案,首先你应该展示你已经做了什么。包括一些代码。 StackOverflow 不是为别人写代码的人,而是在你尝试但找不到解决方案后寻求帮助。
-
这是我的浏览器适配器。在这里,我正在从 url 加载图像,但是当在 pageradapter 中加载第十张图像时,我得到了 oom
标签: android universal-image-loader