日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异步任务AsyncTask

發布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异步任务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;}} }


模擬進度條的實現:

public class ProgressBarTest extends Activity{private ProgressBar mProgressBar;private MyAsyncTask mTask;protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.progressbar);mProgressBar = (ProgressBar)findViewById(R.id.pg);mTask = new MyAsyncTask();mTask.execute();}class MyAsyncTask extends AsyncTask<Void, Integer, Void>{protected Void doInBackground(Void... params){//模擬進度更新for(int i = 0; i<100;i++){publishProgress(i);try{Thread.sleep(300);}catch(InterruptedException){e.printStackTrace();}}return null;}protected void onProgressUpdate(Integer... values){super.onProgressUpdate(values);//獲取進度更新值mProgressBar.setProgress(values[0]);}} } //然后將此ProgressBarTest類部署至mainActivity中但是這個會出現重復進入線程時,出現”bug“,只有將前面的AsyncTask完成后才能執行當前的任務,只需將AsyncTask生命周期與Activity生命周期一致即可,

只需要在onPause()方法中加入判斷:

protected void onPause(){super.onPause();if(mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING){mTask.cancel(true); //cancel()方法只是將對應的AsyncTask標記為cancel狀態,并不是真的取消//故需要在doInBackground()和onProgressUpdate()方法中加入判斷語句} } protected Void doInBackground(Void... params){//模擬進度更新for(int i = 0; i<100;i++){if(isCancelled()){break;}publishProgress(i);try{Thread.sleep(300);}catch(InterruptedException){e.printStackTrace();}}return null;}protected void onProgressUpdate(Integer... values){ super.onProgressUpdate(values); if(isCancelled()){ return;}//獲取進度更新值mProgressBar.setProgress(values[0]);}
使用AsyncTask注意事項:

必須在UI線程中創建AsyncTask的實例

必須在UI線程中調用AsyncTask的execute()方法

重寫的四個方法是系統自動調用的,不應手動調用

每個AsyncTask只能被執行一次,多次調用將會引發異常
只有doInBackground()方法是運行在其他線程,其他方法都是運行在主線程,即其他方法都可以更新UI,而只有這個方法需要做異步處理



《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的异步任务AsyncTask的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。