下面以下载图片并显示为例:
首先我们需要知道的是AsyncTask是对线程池+Handler的进一步封装。
下面看一个简单的代码:
public class MainActivity extends Activity { private ImageView ivIcon; private static String myUrl = "http://192.168.1.2:8080/tomcat.gif";//图片的ip地址 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ivIcon = (ImageView)findViewById(R.id.iv_icon); new MyTask().execute(myUrl);// 启动AsyncTask } // AsyncTask 异步封装的工具, 可以实现异步请求及主界面更新(对线程池+handler的封装) class MyTask extends AsyncTask<String,Integer,Bitmap>{ // 1.预加载, 运行在主线程 @Override protected void onPreExecute() { super.onPreExecute(); } // 2.正在加载, 运行在子线程(核心方法), 可以直接异步请求 @Override protected Bitmap doInBackground(String... params) { return downLoad(params[0]); } // 3.更新进度的方法, 运行在主线程 @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } // 4.加载结束, 运行在主线程(核心方法), 可以直接更新UI @Override protected void onPostExecute(Bitmap bitmap) { ivIcon.setImageBitmap(bitmap); } } /** * 从服务器下载图片 * @param url 服务器的IP * @return 请求成功返回Bitmap对象,不成功返回null */ private Bitmap downLoad(String url){ try { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.connect(); int code = conn.getResponseCode(); if (code==200){ InputStream inputStream = conn.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; } } catch (IOException e) { e.printStackTrace(); } return null; } }
需要注意的是AsyncTask里面的doInBackground()方法是运行在子线程的,剩下的三个方法是运行在主线程的。所以我们在doInBackground()方法中做耗时操作。