使用URL下载网络图片

来源:互联网 发布:js 中什么是全局对象 编辑:程序博客网 时间:2024/06/07 23:01
 今天,我们来讲解使用资源定位符(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);                }            }        }    }}