异步任务AsyncTask
Android是單線程模型,耗時操作應放在非主線程中執行,故需要異步任務
AsyncTask可以使子線程中更新UI,封裝、簡化異步操作
構建AsyncTask子類的參數
AsyncTask<Params, Progress, Result>是一個抽象類,通常用于被繼承,繼承AsyncTask需要制定三個泛型參數:
Params:啟動任務時輸入參數的類型
Progress:后臺任務執行中返回進度值的類型
Result:后臺執行任務完成后返回結果的類型
構建AsyncTask子類的回調方法:
doInBackground:必須重寫,異步執行后臺線程將要完成的任務,其他的 方法并不是必須的
onPreExecute:執行后臺耗時操作前被調用,通常用戶完成一些初始化操作
onPostExecute:當doInBackground()完成后,系統會自動調用onPostExecute()方法,并將doInBackground方法返回的值傳給該方法
onProgressUpdate:在doInBackground()方法中調用publishProgress()方法更新任務的執行進度后,就會觸發該方法,獲取進度,更新進度條
其中調用順序是: onProExecute()-->doInBackground()-->onPostExecute()
若在doInBackground()中調用publishProgress()方法時,調用順序是:onProExecute()-->doInBackground()-->onProgressUpdate()-->onPostExecute()
加載網絡圖片的實例:
異步處理-->下載圖像
UI線程-->設置圖像
public class ImageTest extends Activity{private ImageView mImageView;private ProgressBar mProgressBar;private static String URI = "http://pic4.nipic.com/20091121/3764872_215617048242_2.jpg";protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.image);mImageView = (ImageView)findViewById(R.id.image);mProgressBar = (ProgressBar)findViewById(R.id.progressbar);new MyAsyncTask().execute(URL); //設置傳遞進的參數}class MyAsyncTask extends AsyncTask<String, void, Bitmap>{//<url類型, 進度值類型,返回值類型>protected void onPreExecute(){super.onPreExecute();mProgressBar.setVisibility(View.VISIBLE); //顯示進度條}protected Bitmap onPostExecute(Bitmap bitmap){super.onPostExecute(bitma);//操作UI,設置圖像mProgressBar.setVisibility(View.GONE);mImageView.setImageBitmap(bitmap);}protected Bitmap doInBackground(String... params){String url = params[0]; //取出對應的URLBitmap bitmap = null;URLConnection connection;InputStream is;try{connection = new URL(url).openConnection();is = connection.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);Thread.sleep(3000); //為了使加載的效果更明顯,人為限制一下//通過decodeStream解析輸入流bitmap = BitmapFactory.decodeStream(bis);is.close(); //注意關閉輸入輸出流bis.close();}catch(IOException e){e.printStackTrace();}catch(InterruptedException e){e.printStackTrace();}//將bitmap返回return bitmap;}} }
只需要在onPause()方法中加入判斷:
使用AsyncTask注意事項:
必須在UI線程中創建AsyncTask的實例
必須在UI線程中調用AsyncTask的execute()方法
重寫的四個方法是系統自動調用的,不應手動調用
每個AsyncTask只能被執行一次,多次調用將會引發異常
只有doInBackground()方法是運行在其他線程,其他方法都是運行在主線程,即其他方法都可以更新UI,而只有這個方法需要做異步處理
總結
以上是生活随笔為你收集整理的异步任务AsyncTask的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中BaseAdapter使
- 下一篇: Android异步加载