AsyncTask的初步了解

下面以下载图片并显示为例:

首先我们需要知道的是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()方法中做耗时操作。

GitHub:https://github.com/godfunc
博客园:http://www.cnblogs.com/godfunc
Copyright ©2019 Godfunc
原文地址:https://www.cnblogs.com/Godfunc/p/6131074.html