Android 使用通用映像加载程序时出现内存不足错误,映像正在刷新

Android 使用通用映像加载程序时出现内存不足错误,映像正在刷新,android,android-listview,universal-image-loader,Android,Android Listview,Universal Image Loader,我正在使用通用图像加载器在ListView中将图像显示为缩略图,但是我遇到内存不足错误,当我滚动列表时,新视图显示的是第一视图的图像,而列表不在滚动阶段,但图像设置为正确的图像 public class NewAdapter extends BaseAdapter { private Activity activity; private ArrayList<String> movieThumbnail; private ArrayList<String

我正在使用通用图像加载器在ListView中将图像显示为缩略图,但是我遇到内存不足错误,当我滚动列表时,新视图显示的是第一视图的图像,而列表不在滚动阶段,但图像设置为正确的图像

public class NewAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<String> movieThumbnail;
    private ArrayList<String> movieText;
    private static LayoutInflater inflater=null;
    static File cacheDir;

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(activity)
    .memoryCache(new WeakMemoryCache())
    .denyCacheImageMultipleSizesInMemory()
    .discCache(new UnlimitedDiscCache(cacheDir))
    .threadPoolSize(5)
    .imageDownloader(new URLConnectionImageDownloader(120 * 1000, 120 * 1000))
    .enableLogging()
    .build();

    DisplayImageOptions options = new DisplayImageOptions.Builder()
    .cacheOnDisc()
    .cacheInMemory()
    .bitmapConfig(Bitmap.Config.RGB_565)
    .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
    .build();

    private ImageLoader imageLoader= ImageLoader.getInstance();

    public NewAdapter(Activity a, ArrayList<String> movieThumbnail, ArrayList<String> movieText) {
        activity = a;
        /*data=d;*/
        this.movieThumbnail = movieThumbnail;
        this.movieText = movieText;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
            cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"JunkFolder");
        else
            cacheDir=activity.getCacheDir();
        if(!cacheDir.exists())
            cacheDir.mkdirs();

        imageLoader.init(config);

    }

    public int getCount() {
        return movieText.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
              vi = inflater.inflate(R.layout.listrow, null);

        TextView text=(TextView)vi.findViewById(R.id.rowListTextView);
        ImageView image=(ImageView)vi.findViewById(R.id.movieImage);
        text.setText(movieText.get(position));
        imageLoader.displayImage(movieThumbnail.get(position), image, options);
        return vi;
    }
}
public类NewAdapter扩展了BaseAdapter{
私人活动;
私家侦探片;
私人编剧电影文本;
专用静态充气机=空;
静态文件cacheDir;
ImageLoaderConfiguration配置=新建ImageLoaderConfiguration.Builder(活动)
.memoryCache(新的WeakMemoryCache())
.DenycacheMageMultipleSizesInMemory()
.discCache(新的未限制的缓存(cacheDir))
.线程池大小(5)
.imageDownloader(新的URLConnectionImageDownloader(120*1000,120*1000))
.enableLogging()
.build();
DisplayImageOptions=new DisplayImageOptions.Builder()
.cacheOnDisc()
.cacheInMemory()
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(imageScaleType.IN\u示例\u INT)
.build();
私有ImageLoader ImageLoader=ImageLoader.getInstance();
公共新适配器(活动a、ArrayList MovietHumbail、ArrayList MovietText){
活动=a;
/*数据=d*/
this.movieThumbnail=movieThumbnail;
this.movieText=movieText;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_-MOUNTED))
cacheDir=新文件(android.os.Environment.getExternalStorageDirectory(),“JunkFolder”);
其他的
cacheDir=activity.getCacheDir();
如果(!cacheDir.exists())
cacheDir.mkdirs();
init(config);
}
public int getCount(){
返回movieText.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
if(convertView==null)
vi=充气机充气(R.layout.listrow,空);
TextView text=(TextView)vi.findViewById(R.id.rowListTextView);
ImageView image=(ImageView)vi.findViewById(R.id.movieImage);
text.setText(movieText.get(position));
imageLoader.displayImage(movieThumbnail.get(位置)、图像、选项);
返回vi;
}
}
下面是ImageView和TextView的Xml布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text_relativelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/latest_list_toggle" />


    <ImageView
        android:id="@+id/movieImage"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginLeft="12dp"
        android:layout_marginTop="14dp" />

    <TextView
        android:id="@+id/rowListTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/movieImage"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="21dp"
        android:paddingTop="20dp"
        android:text="@string/app_name"
        android:textColor="@android:color/black"
        android:textSize="17sp"
        android:textStyle="bold" />
</RelativeLayout>

确保在ImageLoader中根据需要设置图像大小

// decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f) {
        try {
            // decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE = 70;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 1;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale *= 2;
            }

            // decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {
        }
        return null;
    }
//解码图像并对其进行缩放以减少内存消耗
私有位图解码文件(文件f){
试一试{
//解码图像大小
BitmapFactory.Options o=新的BitmapFactory.Options();
o、 inJustDecodeBounds=true;
解码流(新的FileInputStream(f),null,o);
//找到正确的刻度值。它应该是2的幂。
所需的最终int_尺寸=70;
内部宽度=o.向外宽度,高度=o.向外高度;
int标度=1;
while(true){
如果(宽度\u tmp/2<要求的\u尺寸
||高度(tmp/2<所需尺寸)
打破
宽度_tmp/=2;
高度_tmp/=2;
比例*=2;
}
//用inSampleSize解码
BitmapFactory.Options o2=新的BitmapFactory.Options();
o2.inSampleSize=刻度;
返回BitmapFactory.decodeStream(新文件输入流(f),null,o2);
}catch(filenotfounde异常){
}
返回null;
}

在DisplayImageOptions中设置
.resetViewBeforeLoading()

尝试下一步(全部或多个):

减少配置中的线程池大小(.threadPoolSize(…)。建议使用1-5。 使用

在显示选项中。RGB_565中的位图消耗的内存是ARGB_8888中的2倍。 使用

在配置中或在内存中禁用缓存 在显示选项中(不要调用.cacheInMemory())。 使用

在显示选项中。或尝试

.imageScaleType(ImageScaleType.EXACTLY).

避免使用RoundedBitmapDisplayer。它使用ARGB_8888 config创建新的位图对象,以便在工作期间显示。

我解决了在listView刷新时设置正确图像的问题。前面我在调用Imageloader.displayImage()时没有传递DisplayImageOption的变量。现在它可以正常工作了我正在用基本适配器加载一个图像,其中我用毕加索在充气机imageview中设置了图像,并尝试使用图像加载程序,但是,当加载图像就地支架时,我的内存不足,通用图像加载程序和毕加索,特别是三星s4设备出现了异常,我也使用了最新的毕加索jar,但解决方案一无所获。我已经尝试了large hip=true和bitmap.recycle,但无法解决它
.memoryCache(new WeakMemoryCache()) 
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.imageScaleType(ImageScaleType.EXACTLY).