AsyncTask的初步了解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()方法中做耗时操作。
以上是关于AsyncTask的初步了解的主要内容,如果未能解决你的问题,请参考以下文章
片段中的 Asynctask 未到达 onPostExecute
在 AsyncTask 中将新的 TextView 设置为片段
AsyncTask 和 FragmentManager 的问题