URL转Drawable之 Android中获取网络图片的三种方法

时间:2022-08-08 21:08:02

转载自: http://doinone.iteye.com/blog/1074283

Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况。对于这种情况,一般的方法就是耗时操作用线程来实现。下面列三种获取url图片的方法: 
1.直接获取:(容易:ANR,不建议)

[java] view plain copy
  1. mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ;
  2. Drawable drawable = loadImageFromNetwork(IMAGE_URL);
  3. mImageView.setImageDrawable(drawable) ;

公用方法: 

[java] view plain copy
  1. private Drawable loadImageFromNetwork(String imageUrl)
  2. {
  3. Drawable drawable = null;
  4. try {
  5. // 可以在这里通过文件名来判断,是否本地有此图片
  6. drawable = Drawable.createFromStream(
  7. new URL(imageUrl).openStream(), "image.jpg");
  8. } catch (IOException e) {
  9. Log.d("test", e.getMessage());
  10. }
  11. if (drawable == null) {
  12. Log.d("test", "null drawable");
  13. } else {
  14. Log.d("test", "not null drawable");
  15. }
  16. return drawable ;
  17. }

2. 后台线程获取url图片: 

[java] view plain copy
  1. mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ;
  2. new Thread(new Runnable(){
  3. Drawable drawable = loadImageFromNetwork(IMAGE_URL);
  4. @Override
  5. public void run() {
  6. // post() 特别关键,就是到UI主线程去更新图片
  7. mImageView.post(new Runnable(){
  8. @Override
  9. public void run() {
  10. // TODO Auto-generated method stub
  11. mImageView.setImageDrawable(drawable) ;
  12. }}) ;
  13. }
  14. }).start()  ;

3.AsyncTask获取url图片

[java] view plain copy
  1. mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ;
  2. new DownloadImageTask().execute(IMAGE_URL) ;
  3. private class DownloadImageTask extends AsyncTask<String, Void, Drawable>
  4. {
  5. protected Drawable doInBackground(String... urls) {
  6. return loadImageFromNetwork(urls[0]);
  7. }
  8. protected void onPostExecute(Drawable result) {
  9. mImageView.setImageDrawable(result);
  10. }
  11. }