Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Out Of memory error using Universal Image Loader and images getting refreshed

I am using the universal image loader to display the images as thumbnail in ListView however i am getting the out of memory error and when i scroll the list than the new view is having the images of first view when the list was not on scroll stage but than the images gets set to proper image which it should be.

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;
    }
}

and here is Xml Layout for ImageView and TextView

<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>
like image 980
Nitin Bathija Avatar asked Dec 04 '22 13:12

Nitin Bathija


2 Answers

Set .resetViewBeforeLoading() in DisplayImageOptions.

like image 108
nostra13 Avatar answered May 16 '23 06:05

nostra13


try next (all of them or several):

Reduce thread pool size in configuration (.threadPoolSize(...)). 1 - 5 is recommended. Use

 .bitmapConfig(Bitmap.Config.RGB_565)     

in display options. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888. Use

.memoryCache(new WeakMemoryCache()) 

in configuration or disable caching in memory at all in display options (don't call .cacheInMemory()). Use

.imageScaleType(ImageScaleType.IN_SAMPLE_INT)

in display options. Or try

.imageScaleType(ImageScaleType.EXACTLY).

Avoid using RoundedBitmapDisplayer. It creates new Bitmap object with ARGB_8888 config for displaying during work.

like image 44
Manian Rezaee Avatar answered May 16 '23 08:05

Manian Rezaee