android 通用图像加载器内存不足错误

android universal image loader out of memory error

我使用 Universal image loader 1.9.5 从 url.
加载图像 这是适配器

public class BinderDataImg extends BaseAdapter {

static final String KEY_IMG = "img";
LayoutInflater inflater;
List<HashMap<String,String>> imgHashmap;
ViewHolder holder;

ImageLoader imageLoader = ImageLoader.getInstance();

public BinderDataImg(Activity act, List<HashMap<String,String>> map) {
    this.imgHashmap = map;
    inflater = (LayoutInflater) act
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public int getCount() {
    // TODO Auto-generated method stub
    return imgHashmap.size();
}

public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null){
        vi = inflater.inflate(R.layout.list_img, null);
        holder = new ViewHolder();
        holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg);

        vi.setTag(holder);
    }
    else{

        holder = (ViewHolder)vi.getTag();
    }

    String uri = imgHashmap .get(position).get(KEY_IMG);

    imageLoader.displayImage(uri, holder.iv_img);

    return vi;
}

static class ViewHolder{
    ImageView iv_img;
}

}

这是 Activity 配置通用图像加载器

public class ActImg extends AppCompatActivity {

static final String KEY_IMG = "img";
List<HashMap<String,String>> imgHashmap;

List<ClassImg> imgList = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_act_img);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .imageScaleType(ImageScaleType.EXACTLY)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .resetViewBeforeLoading(true)
            .displayer(new FadeInBitmapDisplayer(300))
            .showImageOnLoading(R.drawable.img_loading)
            .build();

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
            .defaultDisplayImageOptions(defaultOptions)
            .threadPoolSize(3)
            .memoryCache(new WeakMemoryCache())
            .diskCacheSize(100 * 1024 * 1024)
    .build();

    Intent i = getIntent();

    CustomListView lvi = (CustomListView)findViewById(R.id.listViewImg);

    try {
        XmlPullParserImg parser = new XmlPullParserImg();
        imgList = parser.parse(getAssets().open(file));
        BinderDataImg binderdata = new BinderDataImg(this, imgHashmap);
        lvi.setAdapter(binderdata);

    }catch(IOException e) {
        e.printStackTrace();
    }

}

更新:这是logcat
05-03 03:50:38.011 18383-18878/tttdigital.readmangaonline E/ImageLoader: null
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(本机方法)
在 android.graphics.Bitmap.createBitmap(Bitmap.java:689)
在 android.graphics.Bitmap.createBitmap(Bitmap.java:666)
在 android.graphics.Bitmap.createBitmap(Bitmap.java:599)
在 com.nostra13.universalimageloader.core.decode.BaseImageDecoder.considerExactScaleAndOrientatiton(BaseImageDecoder.java:218)
在 com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:91)
在 com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:265)
在 com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:238)
在 com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:136)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
在 java.lang.Thread.run(Thread.java:856)

我可以从 url 加载图像,但有些图像无法显示,我得到 OutOfMemory 错误。
如何解决?

有几种方法可以做到这一点,

1)increase your memory cache size below example sets it to 15

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).threadPoolSize(3)
            .threadPriority(Thread.MIN_PRIORITY + 3)
            .denyCacheImageMultipleSizesInMemory()
            .memoryCacheSize(1048576 * 15)               
            .discCache(new UnlimitedDiscCache(cacheDir))
           .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
            .build();

2)Reduce thread pool size i have used 3 below

ImageLoaderConfiguration.Builder(context).threadPoolSize(3)

3)Also try this setting as this works in glide instead of ARGB_8888 use RGB_565

.bitmapConfig(Bitmap.Config.RGB_565) 

一般情况下,如果您要加载大量图像,您可以在清单文件中使用 largeHeap=true 在您的应用中