使用URL下载网络图片

 今天,我们来讲解使用资源定位符(Url)来下载网络图片.由于下载图片属于繁琐操作,我们将其放入新开辟的子线程中。在下面的代码中,由于使用了Handlder来处理UI线程,由于消息机制的原因,可能会造成内存泄漏。为了避免内存泄漏,故在Handler中使用了WeakReference(弱引用)来释放内存。

public class MainActivity extends AppCompatActivity {

    private WeakReference<MainActivity>weakReference;
    private Button button;
    private ImageView imageView;
    static String path="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/
u=2237129721,1649030900&fm=23&gp=0.jpg";

    private Handler handler=new myHandler(this);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button= (Button) findViewById(R.id.button);
        imageView= (ImageView) findViewById(R.id.image);


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //启动一条新线程,防止UI线程处理耗时操作
           new Thread(new Runnable() {
               @Override
               public void run() {
                   try {
                       //使用资源定位符,path为指定的图片网址
                       URL url=new URL(path);
                       //使用资源定位符打开流的操作
                       InputStream inputStream=url.openStream();
                       //将读到的流转换成bitmap,用工厂类来解析流。
                       Bitmap bitmap= BitmapFactory.decodeStream(inputStream);
                       //使用handler的obtainMessage的方法来放置对象obj
                       Message message =handler.obtainMessage(0x123,bitmap);
                       handler.sendMessage(message);
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
           }).start();

            }
        });
    }
    //定义一个Handler处理器,处理接收到的信息,改变ImageView。
    //使用软引用,放置内存泄漏
    private class myHandler extends Handler {

        private final WeakReference<MainActivity> weakReference;

        private myHandler(MainActivity activity) {
            weakReference = new WeakReference<MainActivity>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(weakReference.get()!=null){
                if(msg.what==0x123){
                    MainActivity.this.imageView.setImageBitmap((Bitmap) msg.obj);
                }
            }
        }
    }


}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值