Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 934
rahstame Avatar asked Jul 19 '13 03:07

rahstame


2 Answers

Try to implement this inside your onCreateView:

For Activity -

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

For Fragment -

ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(getActivity())); 
like image 129
TheLittleNaruto Avatar answered Sep 18 '22 14:09

TheLittleNaruto


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.

like image 36
Jaiprakash Soni Avatar answered Sep 20 '22 14:09

Jaiprakash Soni