文章出處

下面以下載圖片并顯示為例:

首先我們需要知道的是AsyncTask是對線程池+Handler的進一步封裝。

下面看一個簡單的代碼:

 1 public class MainActivity extends Activity {
 2     private ImageView ivIcon;
 3     private static String myUrl = "http://192.168.1.2:8080/tomcat.gif";//圖片的ip地址
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         ivIcon = (ImageView)findViewById(R.id.iv_icon);
 9         
10         new MyTask().execute(myUrl);// 啟動AsyncTask
11     }
12 
13     // AsyncTask 異步封裝的工具, 可以實現異步請求及主界面更新(對線程池+handler的封裝)
14     class MyTask extends AsyncTask<String,Integer,Bitmap>{
15 
16         // 1.預加載, 運行在主線程
17         @Override
18         protected void onPreExecute() {
19             super.onPreExecute();
20         }
21 
22         // 2.正在加載, 運行在子線程(核心方法), 可以直接異步請求
23         @Override
24         protected Bitmap doInBackground(String... params) {
25             return  downLoad(params[0]);
26         }
27 
28         // 3.更新進度的方法, 運行在主線程
29         @Override
30         protected void onProgressUpdate(Integer... values) {
31             super.onProgressUpdate(values);
32         }
33 
34         // 4.加載結束, 運行在主線程(核心方法), 可以直接更新UI
35         @Override
36         protected void onPostExecute(Bitmap bitmap) {
37             ivIcon.setImageBitmap(bitmap);
38         }
39     }
40 
41     /**
42      * 從服務器下載圖片
43      * @param url  服務器的IP
44      * @return 請求成功返回Bitmap對象,不成功返回null
45      */
46     private Bitmap downLoad(String url){
47         try {
48             HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
49             conn.setRequestMethod("GET");
50             conn.setConnectTimeout(5000);
51             conn.setReadTimeout(5000);
52             conn.connect();
53 
54             int code = conn.getResponseCode();
55 
56 
57             if (code==200){
58                 InputStream inputStream = conn.getInputStream();
59                 Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
60                 return bitmap;
61             }
62         } catch (IOException e) {
63             e.printStackTrace();
64         }
65 
66         return null;
67     }
68 }

需要注意的是AsyncTask里面的doInBackground()方法是運行在子線程的,剩下的三個方法是運行在主線程的。所以我們在doInBackground()方法中做耗時操作。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()