Android中ImageLoader的使用

来源:互联网 发布:json查看 编辑:程序博客网 时间:2024/03/29 18:55

ImageLoader是用来加载多个网络图片的,这次我们实现的是把网络图片加载到ListView中。

首先我们把Volley.jar包添加到Android Studio中的libs目录中,然后刷新一下。

activity_main中只有一个ListView

一、MainActivity:

package com.example.administrator.imageloader;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ListView;import com.example.administrator.imageloader.adapter.ImageAdapter;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private ListView lv;    private List<String>urls;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        lv = (ListView) findViewById(R.id.lv);        urls = new ArrayList<>();        initList();        ImageAdapter adapter = new ImageAdapter(urls,this);        lv.setAdapter(adapter);    }    private void initList() {        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img2.imgtn.bdimg.com/it/u=1942812496,2337888220&fm=21&gp=0.jpg");        urls.add("http://img5.imgtn.bdimg.com/it/u=1755111051,4257519768&fm=21&gp=0.jpg");        urls.add("http://img5.imgtn.bdimg.com/it/u=921123054,1714480967&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");    }}
二、单例设计模式的类:

package com.example.administrator.imageloader;import android.content.Context;import android.graphics.Bitmap;import android.util.LruCache;import com.android.volley.RequestQueue;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.Volley;/** * 单例设计模式 * Created by 匡效国 on 15-11-3. */public class NetworkSingleTon {    private static ImageLoader imageLoader;    private static RequestQueue requestQueue;    private Context context;    private static NetworkSingleTon singleInstance;    //公有的创造方法    public static NetworkSingleTon createNetworkSingleTon(Context context) {        if (singleInstance == null) {            singleInstance = new NetworkSingleTon(context);        }        return singleInstance;    }    private NetworkSingleTon(Context context) {        //在私有的构造函数中实例化requestQueue和imageLoader        requestQueue = Volley.newRequestQueue(context);        imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {            int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);            private LruCache<String, Bitmap> lruCache = new LruCache<String, Bitmap>(maxSize) {                @Override                protected int sizeOf(String key, Bitmap value) {                    int ret = value.getRowBytes() * value.getHeight();                    return ret;                }            };            @Override            public Bitmap getBitmap(String url) {                return lruCache.get(url);            }            @Override            public void putBitmap(String url, Bitmap bitmap) {                lruCache.put(url, bitmap);            }        });    }    public static RequestQueue getRequestQueue() {        return requestQueue;    }    public static ImageLoader getImageLoader() {        return imageLoader;    }}
三、创建一个Application的子类,实例化单例模式类:

package com.example.administrator.imageloader;import android.app.Application;/** * Created by Administrator on 15-11-3. */public class MyApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        //getApplicationContext()获取Application的上下文        //将NetworkSingleTon实例化        NetworkSingleTon.createNetworkSingleTon(getApplicationContext());    }}
四、在清单文件中声明:

<application        android:name=".MyApplication"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">
五、创建适配器:

package com.example.administrator.imageloader.adapter;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import com.android.volley.RequestQueue;import com.android.volley.VolleyError;import com.android.volley.toolbox.ImageLoader;import com.example.administrator.imageloader.NetworkSingleTon;import java.util.List;/** * Created by Administrator on 15-11-3. */public class ImageAdapter extends BaseAdapter {    private List<String> list;    private Context context;    private ImageLoader imageLoader;    private RequestQueue requestQueue;    public ImageAdapter(List<String> list, final Context context) {        this.list = list;        this.context = context;        //调用NetworkSingleTon类的静态方法得到requestQueue和imageLoader        requestQueue = NetworkSingleTon.getRequestQueue();        imageLoader = NetworkSingleTon.getImageLoader();    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ImageView imageView = null;        if (convertView != null) {            imageView = (ImageView) convertView;        } else {            imageView = new ImageView(context);        }        String url = list.get(position);        final ImageView finalImageView = imageView;        //获取回调函数中返回的Bitmap并设置给ImageView        imageLoader.get(url, new ImageLoader.ImageListener() {            @Override            public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {                finalImageView.setImageBitmap(imageContainer.getBitmap());            }            @Override            public void onErrorResponse(VolleyError volleyError) {            }        });        return finalImageView;    }}
运行结果:







0 0