android task详解,Android AsyncTask的使用详解
當(dāng)然,我們?cè)谶M(jìn)行耗時(shí)操作或者更新UI時(shí),是可以使用匿名線程的,但是此種方式是存在缺陷的:第一,線程的開(kāi)銷較大,如果每個(gè)任務(wù)都要?jiǎng)?chuàng)建一個(gè)線程,那么應(yīng)用 程序的效率要低很多;第二,線程無(wú)法管理,匿名線程創(chuàng)建并啟動(dòng)后就不受程序的控制了,如果有很多個(gè)請(qǐng)求發(fā)送,那么就會(huì)啟動(dòng)非常多的線程,系統(tǒng)將不堪重負(fù)。 另外,前面已經(jīng)看到,在新線程中更新UI還必須要引入handler,這讓代碼看上去非常臃腫。
所以建議使用AsyncTask異步線程:AsyncTask的特點(diǎn)是任務(wù)在主線程之外運(yùn)行,而回調(diào)方法是在主線程中執(zhí)行,這就有效地避免了使用Handler帶來(lái)的麻煩。
AsyncTask是抽象類,子類必須實(shí)現(xiàn)抽象方法doInBackground(Params... p) ,在此方法中實(shí)現(xiàn)任務(wù)的執(zhí)行工作,比如連接網(wǎng)絡(luò)獲取數(shù)據(jù)等。通常還應(yīng)該實(shí)現(xiàn)onPostExecute(Result r)方法,因?yàn)閼?yīng)用程序關(guān)心的結(jié)果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創(chuàng)建實(shí)例。AsyncTask定義了三種泛型類型 Params,Progress和Result。
* Params 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請(qǐng)求的URL。
* Progress 后臺(tái)任務(wù)執(zhí)行的百分比。
* Result 后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String。
效果如圖:(加載雅虎天氣---耗時(shí)操作)
具體代碼如下:
/**
* 使用AsyncTask異步線程
* @author 張進(jìn)
*
*/
public class NetActivity extends Activity {
//雅虎天氣的URL
private static final String HttpUrl = "http://xml.weather.yahoo.com/forecastrss?u=c&p=CHXX0008";
private TextView tv ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("NetActivity", Thread.currentThread().getId()+"");
LinearLayout mLinearLayout = new LinearLayout(this);
mLinearLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mLinearLayout.setGravity(Gravity.CENTER);
tv = new TextView(this);
tv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mLinearLayout.addView(tv);
setContentView(mLinearLayout);
//執(zhí)行異步線程
PageTask task = new PageTask(this);
task.execute(HttpUrl);
}
class PageTask extends AsyncTask {
ProgressDialog mProgressDialog = null ;
Context mContext ;
public PageTask(Context context){
mContext = context;
}
//此方法在主線程執(zhí)行,當(dāng)任務(wù)執(zhí)行之前開(kāi)始調(diào)用此方法,可以在這里顯示進(jìn)度對(duì)話框
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.i("PageTask", "onPreExecute()? "+Thread.currentThread().getId());
mProgressDialog = new ProgressDialog(mContext);
mProgressDialog.setTitle("請(qǐng)稍等...");
mProgressDialog.setMessage("數(shù)據(jù)加載中");
mProgressDialog.show();
}
//此方法在后臺(tái)線程執(zhí)行,完成任務(wù)的主要工作,通常需要較長(zhǎng)的時(shí)間。
//在執(zhí)行過(guò)程中可以調(diào)用publicProgress(Progress...)來(lái)更新任務(wù)的進(jìn)度。
@Override
protected String doInBackground(String... params) {
Log.i("PageTask", "doInBackground... "+Thread.currentThread().getId());
try {
HttpClient client = new DefaultHttpClient();
// params[0] 代表連接的url
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
//網(wǎng)路連接通
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
String s = null;
if (is != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[128];
int ch = -1;
int count = 0;
while ((ch = is.read(buf)) != -1) {
baos.write(buf, 0, ch);
count += ch;
if (length > 0) {
// 如果知道響應(yīng)的長(zhǎng)度,調(diào)用publishProgress()更新進(jìn)度
publishProgress((int) ((count / (float) length) * 100));
}
// 為了在模擬器中清楚地看到進(jìn)度,讓線程休眠1000ms
Thread.sleep(2000);
}
return new String(baos.toByteArray());
}
}
//網(wǎng)絡(luò)連接不通
else{
return "網(wǎng)絡(luò)連接不通";
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//此方法在主線程執(zhí)行,用于顯示任務(wù)執(zhí)行的進(jìn)度
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.i("PageTask", "onProgressUpdate()? "+Thread.currentThread().getId());
NetActivity.this.setTitle("加載了? "+values[0]+"%");
}
//此方法在主線程執(zhí)行,任務(wù)執(zhí)行的結(jié)果作為此方法的參數(shù)返回。
@Override
protected void onPostExecute(String result) {
tv.setText(result);
Log.i("PageTask", "onPostExecute()? "+Thread.currentThread().getId());
mProgressDialog.dismiss();
}
}
}
總結(jié)
以上是生活随笔為你收集整理的android task详解,Android AsyncTask的使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓侠盗猎车手罪恶都市(安卓侠盗猎车手)
- 下一篇: android 号码查联系人,Andro