android 下载图片并缓存

      此demo演示android 下载图片并缓存,并显示的过程。


demo:下载地址


打开权限:

<uses-permission android:name="android.permission.INTERNET"/>


源码:

package fk.androiddemo_023;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

//从服务器下载图片并缓存
public class MainActivity extends Activity implements View.OnClickListener{
    Button but;
    ImageView imageView;
    MyHandler handler;
    String imageUrl;
    //用于缓存图片
    private Map<String, SoftReference<Drawable>> imageCache;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        but = (Button) findViewById(R.id.button);
        but.setOnClickListener(this);
        imageView = (ImageView) findViewById(R.id.imageView);

        handler = new MyHandler();
        imageCache = new HashMap<>();
        //下载地址
        imageUrl = "http://mystudy.bj.bcebos.com/testImg.jpg";
    }

    @Override
    public void onClick(View v) {
        if (loadDrawable()) {//如果为true,图片已被缓存
            //根据缓存key,得到图片并显示
            imageView.setImageDrawable(imageCache.get(imageUrl).get());
        }
    }

    public Boolean loadDrawable() {//判断图片是否有缓存
        if (imageCache.containsKey(imageUrl)) {
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            if (softReference.get() != null) {
                return true;//有缓存,返回true
            }
        }
        new MyThread().start();//没有缓存,去下载,返回false
        return false;
    }

    class MyThread extends Thread {
        public void run() {
            Drawable drawable = loadImageFromUrl(imageUrl);//下载图片
            if(drawable!=null){//下载成功
                imageCache.put(imageUrl, new SoftReference<>(drawable));//把图片放入缓存
                //通知主线程图片已经下载好,并把图片资源传送过去
                Message message = handler.obtainMessage(0, drawable);
                handler.sendMessage(message);
            }
        }
    }

    public Drawable loadImageFromUrl(String imageUrl) {
        try {
            //从服务器下载获得图片资源
            return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");
        } catch (Exception e) {
            System.out.println(e+"下载失败!!!!!!!!");
            return null;
        }
    }

    class MyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            //显示图片
            imageView.setImageDrawable((Drawable) msg.obj);
        }
    }
}

运行截图:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章