Android - ImageLoader must be init with configuration before using in UIL
Asked Answered
S

5

38

I got the error:

ImageLoader must be init with configuration before using is the error from Illegal State Exception.

I am struggling to display the images in my approach of putting the gridview inside a fragments. As for my understanding the imageLoader should be initialized first by extending the class AbsListViewBaseActivity which will be extending BaseActivity.

These two classes are used to initialize the imageLoader. I pretty messed up with the flow, and I am getting errors in runtime and been working with this in two days. I'll include LogCat errors.

My own version

--Main Class

import com.nostra13.universalimageloader.core.ImageLoader;
import com.folder.folder.AbsListViewBaseActivity;

public class CollectionDemoActivity extends FragmentActivity{

    assignImageLoader newAssign;
    static AbsListViewBaseActivity absList;
    static ImageAdapter m3;

    Oncreate()
    {
        newAssign = assignImageLoader;
        m3 = ImageAdapter();
        ((GridView) absList.listView).setAdapter(m3);
    }
}


/**
 * A dummy fragment representing a section of the app, but that simply displays dummy text.
 */

public static class DemoObjectFragment extends Fragment {

    public static final String ARG_OBJECT = "object";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.ac_image_grid, container, false);

        List<Menu> itemsDatabase = db.getItemsAsArray("items");
        List<String> items = new ArrayList<String>();

        for (Menu cn : itemsDatabase) {

            HashMap<String, String> map = new HashMap<String, String>();
            items.add(cn.getImagePath().toString());
            values2.add(map);
        }

        imageUrls = items.toArray(new String[items.size()]);

        options2 = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.ic_stub)
            .showImageForEmptyUri(R.drawable.ic_empty)
            .showImageOnFail(R.drawable.ic_error)
            .cacheInMemory(true)
            .cacheOnDisc(true)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .build();

        absList.listView = (GridView)rootView.findViewById(R.id.gridview);

        ((GridView) absList.listView).setAdapter(m3);
        absList.listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //startImagePagerActivity(position);
                //Toast.makeText(getBaseContext(), "Clieckeed", Toast.LENGTH_SHORT).show();
                //Log.d("Inside Onclick:", view.toString());
            }
        });
        return rootView;
    }
}

class ImageAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        return imageUrls.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    public View getView(final int position, View convertView, ViewGroup parent) {

        View view = convertView;
        final ViewHolder holder;

        // Assign Values
        holder.name.setText(values2.get(position).get(TAG_NAME2 ).toString());
        holder.price.setText("Price: " + values2.get(position).get(TAG_PRICE2).toString());

        holder.br.setStepSize(1);
        holder.br.setFocusable(false);

        Log.d("Image Path Value in GridViewdd: ", values2.get(position).get(TAG_IMAGE_NAME2).toString());

        newAssign.getImageLoader("Image Path", holder.image, options2);

        return view;
    }

    class ViewHolder {
        public TextView name;
        public TextView price;
        public ImageView image;
        public RatingBar br;
    }
}

static class assignImageLoader extends AbsListViewBaseActivity{
    static ImageLoader mg;

    assignImageLoader()
    {
        mg = imageLoader;
    }

    public void getImageLoader(String path, ImageView img, DisplayImageOptions options)
    {
        imageLoader.displayImage(path, img, options);
    }
}

Original implementation and flow of the program

--Main Class

public class ImageGridActivity extends AbsListViewBaseActivity {

    onCreate()
    {
        ((GridView) listView).setAdapter(new ImageAdapter());
    }

    public class ImageAdapter extends BaseAdapter {

        public View getView(final int position, View convertView, ViewGroup parent) {

            imageLoader.displayImage(path, holder.image, options2);
        }
    }
}

--AbsListViewBaseActivity

public class AbsListViewBaseActivity extends BaseActivity {

    protected static final String STATE_PAUSE_ON_SCROLL = "STATE_PAUSE_ON_SCROLL";
    protected static final String STATE_PAUSE_ON_FLING = "STATE_PAUSE_ON_FLING";

    public AbsListView listView;

    protected boolean pauseOnScroll = false;
    protected boolean pauseOnFling = true;

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        pauseOnScroll = savedInstanceState.getBoolean(STATE_PAUSE_ON_SCROLL, false);
        pauseOnFling = savedInstanceState.getBoolean(STATE_PAUSE_ON_FLING, true);
    }

    @Override
    public void onResume() {
        super.onResume();
        applyScrollListener();
    }

    private void applyScrollListener() {
        listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(STATE_PAUSE_ON_SCROLL, pauseOnScroll);
        outState.putBoolean(STATE_PAUSE_ON_FLING, pauseOnFling);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem pauseOnScrollItem = menu.findItem(R.id.item_pause_on_scroll);
        pauseOnScrollItem.setVisible(true);
        pauseOnScrollItem.setChecked(pauseOnScroll);

        MenuItem pauseOnFlingItem = menu.findItem(R.id.item_pause_on_fling);
        pauseOnFlingItem.setVisible(true);
        pauseOnFlingItem.setChecked(pauseOnFling);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.item_pause_on_scroll:
                pauseOnScroll = !pauseOnScroll;
                item.setChecked(pauseOnScroll);
                applyScrollListener();
                return true;

            case R.id.item_pause_on_fling:
                pauseOnFling = !pauseOnFling;
                item.setChecked(pauseOnFling);
                applyScrollListener();
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

BaseActivity

public abstract class BaseActivity extends Activity {

    public ImageLoader imageLoader = ImageLoader.getInstance();

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
                //Added in the code by me for handling the init error
        imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseContext()));

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.item_clear_memory_cache:
                imageLoader.clearMemoryCache();
                return true;

            case R.id.item_clear_disc_cache:
                imageLoader.clearDiscCache();
                return true;

            default:
                imageLoader.destroy();
                return false;
        }
    }
}

Logcat:

07-19 11:28:26.909: E/AndroidRuntime(24023): FATAL EXCEPTION: main
07-19 11:28:26.909: E/AndroidRuntime(24023): java.lang.IllegalStateException: ImageLoader must be init with configuration before using
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.nostra13.universalimageloader.core.ImageLoader.checkConfiguration(ImageLoader.java:325)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:170)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:134)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.jinisys.restoplusordering.CollectionDemoActivity$assignImageLoader.getImageLoader(CollectionDemoActivity.java:448)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.jinisys.restoplusordering.CollectionDemoActivity$ImageAdapter.getView(CollectionDemoActivity.java:424)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.AbsListView.obtainView(AbsListView.java:2267)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.GridView.onMeasure(GridView.java:1030)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1447)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer.doFrame(Choreographer.java:525)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.os.Handler.handleCallback(Handler.java:615)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.os.Looper.loop(Looper.java:137)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.app.ActivityThread.main(ActivityThread.java:4745)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at java.lang.reflect.Method.invokeNative(Native Method)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at java.lang.reflect.Method.invoke(Method.java:511)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at dalvik.system.NativeStart.main(Native Method)

Basing from this Approach:

ImageGallery

Sickle answered 19/7, 2013 at 3:55 Comment(6)
#16790176. check this example of UIL. might helpBurack
what's on line 448 CollectionDemoActivity.java? Also what is this method Oncreate() in CollectionDemoActivity.java?Burack
@Burack I tried to see the answers and the codes, but I think is far from what I need. Maybe my need is a matter of extending another class manipulations to get the same flow from the orginal. Not sure though. Please help me with this sir. I been working with this one in two days.Sickle
the error 488, imageLoader.displayImage(path, img, options);Sickle
i am confused your adapter class has this newAssign.getImageLoader(Image Path, holder.image, options2) where is your view holder and options2 intialized. Your app flow is very confusingBurack
sir, I added code above. Please see. newAssign.getImageLoader(Image Path, holder.image, options2) and imageLoader.displayImage(path, img, options) are the same I just tried to create another class just to experiment and see if extending the AbsListViewBaseActivity will work.Sickle
R
116

Try to implement this inside your onCreateView:

For Activity -

BaseActivity.imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseCont‌​ext()));

For Fragment -

ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(getActivity()));
Roana answered 19/7, 2013 at 5:57 Comment(6)
Glad to help. Any time. :PRoana
where should I implement it??Partisan
Incase you still don't know @Partisan you can implement this in the onCreateViewAerology
@Roana ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(MyActivity.this)); this way is working for me.Housekeeping
ImageLoader imageLoader =ImageLoader.getInstance(); imageLoader.init(ImageLoaderConfiguration.createDefault(ctx)); This will work ...!!Leonidaleonidas
in fragment we can use like this ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(getActivity()));Septennial
F
7

I think you are using the Universal image loader API. If yes, then you have forgot to configure the image loader in the Application class.

Add the below function in your Application class:

public static void initImageLoader(Context context) {

    // This configuration tuning is custom. You can tune every option, you may tune some of them,
    // or you can create default configuration by the
    //  ImageLoaderConfiguration.createDefault(this);
    // method.
    //
    ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
    config.threadPriority(Thread.NORM_PRIORITY - 2);
    config.denyCacheImageMultipleSizesInMemory();
    config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
    config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
    config.tasksProcessingOrder(QueueProcessingType.LIFO);
    config.writeDebugLogs(); // Remove for release app

    // Initialize ImageLoader with configuration.
    ImageLoader.getInstance().init(config.build());
}

For more details, check this sample.

Fugger answered 19/7, 2013 at 4:29 Comment(0)
R
6

This worked better for me.

Put the following in the onCreate of your activity

   ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(MyActivity.this));
Rives answered 2/9, 2016 at 13:49 Comment(0)
P
0

Just put the following code in the BaseActivity or MyApplication class:

public ImageLoader getImageLoader() {

    if (mImageLoader == null) {
        mImageLoader = ImageLoader.getInstance();
        mImageLoader.init(ImageLoaderConfiguration.createDefault(this));
    }
    return this.mImageLoader;
}

Then whenever you want to use the image loader then create a new instance of ImageLoader, just like the following:

private ImageLoader imageLoader = MyApplication.getInstance().getImageLoader();

Or if you take BaseActivitiy enter code here:

private ImageLoader imageLoader = BaseActivity.getInstance().getImageLoader();
Pelota answered 8/2, 2016 at 5:29 Comment(0)
T
-1

First, check that user imageLoader.jar packet is properly included in the project by going in project properties → Java build path.

Second, implement this code in the onCreateView

BaseActivity.imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseCont‌​ext()));
Titanium answered 14/10, 2015 at 11:28 Comment(1)
What do you mean by "user imageLoader.jar packet"?Leyla

© 2022 - 2024 — McMap. All rights reserved.