Android, How to instantiate Universal Image Loader?
android, image, view
Solution
When i remove jar file from Java class path and change the name of folder from "lib" to "libs", then jar file automatically adds to Android Dependencies. Now, everything is fine
Problem
In my project I have a grid view which contains images. Based on my research, Universal Image Loader project is designed to download images in background. Then based of sample I set my adapter. This is the code that I have written: ``` package cam.astro.mania.adapters; import java.io.File; import java.util.ArrayList; import com.astro.mania.activities.Contestants_Photo; import com.astro.mania.activities.R; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache; import com.nostra13.universalimageloader.core.DecodingType; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.ImageLoadingListener; import android.app.ProgressDialog; import android.content.Context; import android.graphics.Bitmap; import android.os.Environment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ProgressBar; public class ContestantsPhotoAdapter extends BaseAdapter { private Context context; private LayoutInflater myInflater; private Bitmap[] bitmapList; private Bitmap bitmap; private ArrayList<String> ListOfURLs; private ImageLoader imageLoader; private ProgressDialog progressBar; private File cacheDir; private ImageLoaderConfiguration config; private DisplayImageOptions options; public ContestantsPhotoAdapter(Context c) { context = c; myInflater = LayoutInflater.from(c); // Get singleton instance of ImageLoader imageLoader = ImageLoader.getInstance(); } public void setImageURLs(ArrayList<String> list){ ListOfURLs = list; for(String str: ListOfURLs) Log.i("URL Address>>>>", str); cacheDir = new File(Environment.getExternalStorageDirectory(), "UniversalImageLoader/Cache"); // Create configuration for ImageLoader config = new ImageLoaderConfiguration.Builder(context) .maxImageWidthForMemoryCache(800) .maxImageHeightForMemoryCache(800) .httpConnectTimeout(5000) .httpReadTimeout(30000) .threadPoolSize(5) .threadPriority(Thread.MIN_PRIORITY + 2) .denyCacheImageMultipleSizesInMemory() .memoryCache(new UsingFreqLimitedMemoryCache(2000000)) // You can pass your own memory cache implementation .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) .build(); // Creates display image options for custom display task options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.icon_loading) .showImageForEmptyUrl(R.drawable.icon_remove) .cacheInMemory() .cacheOnDisc() .decodingType(DecodingType.MEMORY_SAVING) .build(); // Initialize ImageLoader with created configuration. Do it once. imageLoader.init(config); } @Override public int getCount() { return ListOfURLs.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent){ ViewHolder holder; if (convertView == null) { convertView = myInflater.inflate(R.layout.grid_contestantsphoto, null); holder = new ViewHolder(); holder.ivIcon = (ImageView) convertView.findViewById(R.id.imvContestantsPhoto_icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // holder.ivIcon.setImageBitmap(bitmapList[position]); String imageUrl = ListOfURLs.get(position); // Load and display image imageLoader.displayImage(imageUrl, holder.ivIcon, options, new ImageLoadingListener() { @Override public void onLoadingStarted() { showLoading(); } @Override public void onLoadingFailed() { stopLoading(); } @Override public void onLoadingComplete() { stopLoading(); } }); return convertView; } static class ViewHolder { ImageView ivIcon; } /*----------------------------------------------------------------------------------- * Showing / Stopping progress dialog which is showing loading animation * ---------------------------------------------------------------------------------*/ private void showLoading(){ progressBar = ProgressDialog.show(context, "", ""); progressBar.setContentView(R.layout.anim_loading); progressBar.setCancelable(true); final ImageView imageView = (ImageView) progressBar.findViewById(R.id.blankImageView); Animation rotation = AnimationUtils.loadAnimation(context, R.anim.rotate); imageView.startAnimation(rotation); } private void stopLoading() { if(progressBar.isShowing()) progressBar.dismiss(); } } ``` What I did? 1) I downloaded universal-image-loader-1.2.3.jar and put it into MY_PROJECT/lib folder then I added this jar file into java build path 2) Because for cashing images, this library needs to have access to local storage, therefore I added `<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>` to manifest file. 3) Now, when I run, the application crashes and points to `imageLoader = ImageLoader.getInstance();`. Logcat message is: ``` dalvikvm: Could not find class 'cam.astro.mania.adapters.ContestantsPhotoAdapter$1', referenced from method cam.astro.mania.adapters.ContestantsPhotoAdapter.getView AndroidRuntime: java.lang.NoClassDefFoundError: com.nostra13.universalimageloader.core.ImageLoader AndroidRuntime: at cam.astro.mania.adapters.ContestantsPhotoAdapter.<init>(ContestantsPhotoAdapter.java:50) ``` Based on my research (for example here), I found that this message "comes when Java Virtual Machine is not able to find a particular class at runtime which was available during compile time."