Android,如何实例化Universal Image Loader?

标签 android image view

在我的项目中,我有一个包含图像的 GridView 。根据我的研究,Universal Image Loader项目旨在在后台下载图像。然后根据样本我设置了我的适配器。这是我编写的代码:

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

}

我做了什么? 1)我下载了universal-image-loader-1.2.3.jar并将它放入 MY_PROJECT/lib 文件夹然后我将这个 jar 文件添加到 java 构建路径 enter image description here

2) 因为要兑现图片,这个库需要访问本地存储,所以我添加了<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/> list 文件。

3) 现在,当我运行时,应用程序崩溃并指向 imageLoader = ImageLoader.getInstance(); . Logcat 消息是:

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)

根据我的研究(例如 here),我发现此消息“当 Java 虚拟机无法在运行时找到在编译时可用的特定类时出现。 "

最佳答案

当我从 Java 类路径中删除 jar 文件并将文件夹的名称从“lib”更改为“libs”时,jar 文件会自动添加到 Android 依赖项中。现在,一切都很好

关于Android,如何实例化Universal Image Loader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10257667/

相关文章:

c# - 在 C# 中使用 IronOCR 进行光学字符识别

android - android 中的 setBackgroundDrawable

ios - 跳过swift ViewController viewDidDisappear等主要功能

android - 访问设备的字典

android - classes.dex 文件在哪里

android - Firebase Crashlytics 无法在 Firebase 控制台中报告崩溃

android - MyFirstApp Android 编码教程中的错误“Intent 构造函数未定义。

c++ - 无法使用 C++ 在 Matlab 上打开重新采样的图像

java - 如何在 Mac 上使用 JavaFX 将图像保存到文件系统?

android - 如何显示介绍 View 5 秒