Android AsyncTask简单用法
三個(gè)泛型參數(shù):
Param?任務(wù)執(zhí)行器需要的數(shù)據(jù)類(lèi)型
Progress?后臺(tái)計(jì)算中使用的進(jìn)度單位數(shù)據(jù)類(lèi)型
Result?后臺(tái)計(jì)算返回結(jié)果的數(shù)據(jù)類(lèi)型有些參數(shù)是可以設(shè)置為不使用的,只要傳遞為Void型即可,比如AsyncTask
四個(gè)步驟:onPreExecute(),執(zhí)行預(yù)處理,它運(yùn)行于UI線(xiàn)程,可以為后臺(tái)任務(wù)做一些準(zhǔn)備工作,比如繪制一個(gè)進(jìn)度條控件。doInBackground(Params…),后臺(tái)進(jìn)程執(zhí)行的具體計(jì)算在這里實(shí)?現(xiàn),doInBackground(Params…)是AsyncTask的關(guān)鍵,此方法必須重載。在這個(gè)方法內(nèi)可以使用?publishProgress(Progress…)改變當(dāng)前的進(jìn)度值。onProgressUpdate(Progress…),運(yùn)行于UI線(xiàn)程。如果在doInBackground(Params…)中?使用了publishProgress(Progress…),就會(huì)觸發(fā)這個(gè)方法。在這里可以對(duì)進(jìn)度條控件根據(jù)進(jìn)度值做出具體的響應(yīng)。onPostExecute(Result),運(yùn)行于UI線(xiàn)程,可以對(duì)后臺(tái)任務(wù)的結(jié)果做出處理,結(jié)果就是doInBackground(Params…)的返回值。此方法也要經(jīng)常重載,如果Result為null表明后臺(tái)任務(wù)沒(méi)有完成(被取消或者出現(xiàn)異常)。
這4個(gè)方法都不能手動(dòng)調(diào)用。而且除了doInBackground(Params…)方法,其余3個(gè)方法都是被UI線(xiàn)程所調(diào)用的,所以要求:1)?AsyncTask的實(shí)例必須在UI?thread中創(chuàng)建;2)?AsyncTask.execute方法必須在UI?thread中調(diào)用;
Task只能被執(zhí)行一次,多次調(diào)用時(shí)將會(huì)出現(xiàn)異常,而且是不能手動(dòng)停止。
import?android.app.Activity;?import?android.os.AsyncTask;?
import?android.os.Bundle;?
import?android.util.Log;?
import?android.widget.TextView;?
public?class?AsyncTaskTest?extends?Activity?{?
????TextView?tv;?
????final?String?TAG="AsyncTaskTest";?
??
????@Override?
????protected?void?onCreate(Bundle?savedInstanceState)?{?
????????super.onCreate(savedInstanceState);?
????????setContentView(R.layout.main);?
????????tv?=?(TextView)?findViewById(R.id.label);?
????????new?MyTask().execute(6,?12,?7);?
??
????}?
??
????class?MyTask?extends?AsyncTask<Integer,?Integer,?Integer>?{?
??
????????@Override?
????????protected?void?onPreExecute()?{?
????????????super.onPreExecute();?
????????????Log.d(TAG,?"onPreExecute()");?
????????}?
??
????????@Override?
????????protected?Integer?doInBackground(Integer...?params)?{?
????????????Log.d(TAG,?"doInBackground()");?
????????????int?p?=?0;?
????????????for?(int?index?=?0;?index?<?params.length;?index++)?{?
????????????????int?num?=?params[index];?
????????????????for?(int?j?=?0;?j?<?num;?j++)?{?
????????????????????if?(num?-?j?<=?0)?{?
????????????????????????break;?
????????????????????}?
????????????????????p++;?
????????????????????publishProgress(p);?
????????????????????try?{?
????????????????????????Thread.sleep(500);?
????????????????????}?catch?(InterruptedException?e)?{?
????????????????????????e.printStackTrace();?
????????????????????}?
????????????????}?
????????????}?
????????????return?p;?
????????}
??
????????@Override?
????????protected?void?onProgressUpdate(Integer...?progress)?{?
????????????Log.d(TAG,?"onProgressUpdate()");?
????????????tv.append("\nProgress:?"?+?progress[0]);?
????????}?
??
????????@Override?
????????protected?void?onPostExecute(Integer?result)?{?
????????????Log.d(TAG,?"onPostExecute()");?
????????????tv.append("\nFinished.?Result:?"?+?result);?
????????}?
??
????????@Override?
????????protected?void?onCancelled()?{?
????????????super.onCancelled();?
????????????Log.d(TAG,?"onCancelled()");
????????}
????}
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/DswCnblog/archive/2012/11/12/2766871.html
總結(jié)
以上是生活随笔為你收集整理的Android AsyncTask简单用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 获取当前时间差
- 下一篇: 【Android】【转】查看内存