文/大大大大峰哥
序
AsyncTask是基于異步消息處理機(jī)制,只是Android為了方便我們使用怎虫,將它封裝了起來(lái)茴丰,這讓我們可以更加簡(jiǎn)單便捷的使用,可以輕松地從子線程切換到主線程胧奔。如果想簡(jiǎn)單了解異步消息處理機(jī)制可以看我另外一篇博文簡(jiǎn)單描述Android異步原理逊移。
使用
AsyncTask是一個(gè)抽象類预吆,使用它需要繼承它龙填,繼承的時(shí)候需要注意它擁有三個(gè)泛型參數(shù):Params
,Progress
,Result
岩遗。
Params:需要傳入
的參數(shù)扇商,用于后臺(tái)任務(wù)中使用,如果你不需要傳入數(shù)據(jù)可以將該設(shè)置為Void
宿礁。
Progress:后臺(tái)任務(wù)執(zhí)行時(shí)案铺,往往需要了解后臺(tái)任務(wù)的進(jìn)度,這個(gè)參數(shù)自行設(shè)定成為你需要反映進(jìn)度的數(shù)據(jù)類型梆靖,比如我需要將進(jìn)度用Integer返回等等控汉。
Result:當(dāng)任務(wù)執(zhí)行完畢后,則使用該類型作為反饋類型
返吻,比如使用Boolean類型姑子,那么你可以返回true告訴主線程,我成功運(yùn)行测僵。
方法
在我們繼承AsyncTask后街佑,我們需要了解幾個(gè)重用的重寫方法。
onPreExecute():在我們使用AsyncTask需要初始化
操作的時(shí)候捍靠,我們可以重寫該方法并在里面初始數(shù)據(jù)以及UI沐旨。比如我們可以初始化一個(gè)下載進(jìn)度條。
doInBackground(Params ...):這個(gè)是當(dāng)你繼承AsyncTask必須
重寫的方法榨婆,該方法所有代碼均在子線程
中運(yùn)行磁携,一般是用來(lái)處理耗時(shí)
操作。比如我們?cè)谶@方法向網(wǎng)絡(luò)獲取數(shù)據(jù)良风。
注意:因?yàn)樵谧泳€程中運(yùn)行颜武,那么就不能做更新UI的操作。
onProgressUpdate(Progress ...):在該類中調(diào)用publishProgress方法后拖吼,才會(huì)運(yùn)行這個(gè)方法中的代碼鳞上,通過(guò)傳入的Progress類型后我們可以處理并更新UI。
onPostExecute(Result ):當(dāng)我們后臺(tái)任務(wù)(doInBackground)執(zhí)行完畢之后吊档,return 傳遞的值進(jìn)入onPostExecute方法中篙议,向我們傳遞任務(wù)執(zhí)行結(jié)果,比如我們可以關(guān)閉下載進(jìn)度條對(duì)話框怠硼,并且提示下載成功或者失敗鬼贱。
代碼
學(xué)習(xí)AsyncTask光靠理論說(shuō)是不行的,所以需要看代碼來(lái)輔助理解香璃,在看完之后自己敲一遍才是自己的東西这难,下面是做了一個(gè)模擬下載的功能。
(一)MainActivity.java
package com.example.deme2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton= (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyAsyncTask(MainActivity.this).execute();
}
});
}
}
(二)MyAsyncTask.java
package com.example.deme2;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import static android.content.ContentValues.TAG;
/**
* Created by TangZhiFeng on 2016/12/14.
*/
public class MyAsyncTask extends AsyncTask<Void, Integer
, Boolean> {
Context mContext;
AlertDialog mAlertDialog;
int mDownProgress;
public MyAsyncTask(Context context) {
mContext = context;
}
/*
* 這個(gè)函數(shù)一般是完成一些初始化操作葡秒。
* */
@Override
protected void onPreExecute() {
mDownProgress = 0;
mAlertDialog = new AlertDialog.Builder(mContext)
.setTitle("下載進(jìn)度")
.setMessage(mDownProgress + "")
.create();
mAlertDialog.show();
}
/*
* 這個(gè)函數(shù)一般都是處理一些耗時(shí)操作姻乓,同時(shí)這個(gè)函數(shù)
* 是在子線程完成嵌溢,不能進(jìn)行UI更新操作
* */
@Override
protected Boolean doInBackground(Void... params) {
try {
while (true) {
mDownProgress = doDownload();//模擬下載過(guò)程
if (mDownProgress > 100) {
break;
}
Thread.sleep(1000);
publishProgress(mDownProgress);
Log.i(TAG, "doInBackground: "+mDownProgress);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
private int doDownload() {
return mDownProgress+5;
}
/*
* 調(diào)用publishProgress后,進(jìn)入這個(gè)函數(shù)蹋岩,可以進(jìn)
* 行UI操作
* */
@Override
protected void onProgressUpdate(Integer... values) {
mAlertDialog.setMessage("" + values[0]);
}
/*
* 在后臺(tái)任務(wù)執(zhí)行完畢后調(diào)用該函數(shù)
* */
@Override
protected void onPostExecute(Boolean aBoolean) {
mAlertDialog.dismiss();//關(guān)閉對(duì)話框
if (aBoolean) {
Toast.makeText(mContext, "下載完成", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "下載失敗", Toast.LENGTH_SHORT).show();
}
}
}
總結(jié)
End
希望大家多多指點(diǎn)赖草,有問(wèn)題指出來(lái),互相幫助互相學(xué)習(xí)剪个。