文章出處
文章列表
下面以下載圖片并顯示為例:
首先我們需要知道的是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()方法中做耗時操作。
文章列表
全站熱搜