Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行;2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载。

一、AsyncTask方式

1.main.xml:
[html] view plaincopy
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ImageView  
  7.         android:id="@+id/img"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_centerInParent="true" />  
  11.   
  12. </RelativeLayout>  

2.MainActivity.java:
[java] view plaincopy
 
  1. package com.example.imageloaderdemo;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.MalformedURLException;  
  7. import java.net.ProtocolException;  
  8. import java.net.URL;  
  9.   
  10. import android.app.Activity;  
  11. import android.graphics.Bitmap;  
  12. import android.graphics.BitmapFactory;  
  13. import android.os.AsyncTask;  
  14. import android.os.Bundle;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.ImageView;  
  19.   
  20. public class MainActivity extends Activity {  
  21.     private ImageView mImageView;  
  22.     private static String URLSTRING;  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.         mImageView = (ImageView) findViewById(R.id.img);  
  29.         URLSTRING="http://photocdn.sohu.com/20110927/Img320705637.jpg";//图片地址  
  30.         MyAsyncTask myAsyncTask=new MyAsyncTask();  
  31.         myAsyncTask.execute(URLSTRING);  
  32.           
  33.     }  
  34.   
  35.     class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {  
  36.           
  37.   
  38.         @Override  
  39.         protected void onPostExecute(Bitmap result) {  
  40.             super.onPostExecute(result);  
  41.             mImageView.setImageBitmap(result);  
  42.         }  
  43.   
  44.         @Override  
  45.         protected Bitmap doInBackground(String... params) {  
  46.             Bitmap bitmap=null;  
  47.             try {  
  48.                 URL url=new URL(params[0]);  
  49.                 HttpURLConnection connection=(HttpURLConnection) url.openConnection();  
  50.                 connection.setRequestMethod("GET");  
  51.                 connection.setConnectTimeout(5000);  
  52.                 if(connection.getResponseCode()==200){  
  53.                     InputStream inputStream=connection.getInputStream();  
  54.                     bitmap=BitmapFactory.decodeStream(inputStream);  
  55.                 }  
  56.                   
  57.             } catch (MalformedURLException e) {  
  58.                 e.printStackTrace();  
  59.             } catch (ProtocolException e) {  
  60.                 e.printStackTrace();  
  61.             } catch (IOException e) {  
  62.                 e.printStackTrace();  
  63.             }  
  64.   
  65.             return bitmap;  
  66.         }  
  67.   
  68.     }  
  69.   
  70. }  

3.总结:
1.AsyncTask<String, Void, Bitmap>//三个参数,第一个为传入的URL,第二个表示中间状态的,这里传入空即可,第三个为返回值
2.doInBackground(String... params)方法新开了一个线程,AysncTask其他几个方法都在主线程中运行
3.除了doInBackground方法,其他方法都在主线程中运行,所以这里:
[java] view plaincopy
 
  1. mImageView.setImageBitmap(result);可以直接设置  
 
运行实例如下:
 
成功的加载了网络图片。
 

二、Handler方式

异步请求Bitmap,因为子线程无法更新主线程UI,所以必须通过Handler的方式进行图片渲染。
 
布局文件不变,下面我们看一下MainActivity.java:
 
[java] view plaincopy
 
  1. package com.example.imageloaderdemo;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.MalformedURLException;  
  7. import java.net.ProtocolException;  
  8. import java.net.URL;  
  9.   
  10. import android.app.Activity;  
  11. import android.graphics.Bitmap;  
  12. import android.graphics.BitmapFactory;  
  13. import android.os.Bundle;  
  14. import android.os.Handler;  
  15. import android.os.Message;  
  16. import android.widget.ImageView;  
  17.   
  18. public class MainActivity extends Activity {  
  19.     private ImageView mImageView;  
  20.     private static String URLSTRING;  
  21.   
  22.     private Handler handler = new Handler() {  
  23.         public void handleMessage(Message msg) {  
  24.             Bitmap bitmap = (Bitmap) msg.obj;  
  25.             mImageView.setImageBitmap(bitmap);  
  26.         };  
  27.     };  
  28.   
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.         mImageView = (ImageView) findViewById(R.id.img);  
  34.         URLSTRING = "http://photocdn.sohu.com/20110927/Img320705637.jpg";// 图片地址  
  35.   
  36.         MyThread myThread = new MyThread();  
  37.         myThread.start();// 调用线程  
  38.   
  39.     }  
  40.   
  41.     class MyThread extends Thread {  
  42.         @Override  
  43.         public void run() {  
  44.             super.run();  
  45.             Bitmap bitmap = null;  
  46.             try {  
  47.                 URL url = new URL(URLSTRING);  
  48.                 HttpURLConnection connection = (HttpURLConnection) url  
  49.                         .openConnection();  
  50.                 connection.setRequestMethod("GET");  
  51.                 connection.setConnectTimeout(5000);  
  52.                 if (connection.getResponseCode() == 200) {  
  53.                     InputStream inputStream = connection.getInputStream();  
  54.                     bitmap = BitmapFactory.decodeStream(inputStream);  
  55.                     Message message = new Message();  
  56.                     message.obj = bitmap;  
  57.                     handler.sendMessage(message);  
  58.   
  59.                 }  
  60.   
  61.             } catch (MalformedURLException e) {  
  62.                 e.printStackTrace();  
  63.             } catch (ProtocolException e) {  
  64.                 e.printStackTrace();  
  65.             } catch (IOException e) {  
  66.                 e.printStackTrace();  
  67.             }  
  68.   
  69.         }  
  70.     }  
  71.   
  72. }  

总结:
1.新开一个线程用于网络数据的请求:
[java] view plaincopy
 
  1. class MyThread extends Thread{}  
2.通过sendMessage发送对象,通过handleMessage处理数据。
 
很简单啊,希望可以帮到初学者。
 
喜欢的朋友关注我!谢谢
posted @ 2015-09-02 10:54  java高级技术汇  阅读(192)  评论(0编辑  收藏  举报