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
Try to implement this inside your onCreateView:
For Activity -
BaseActivity.imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseContext()));
For Fragment -
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(getActivity()));
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With