AsyncTask是一個(gè)簡(jiǎn)單輕量級(jí)的異步處理類甸私。
AsyncTask定義了三種泛型類型Params
,Progress
和Result
趴捅。
如: AsyncTask<String, Boolean, Boolean>
- 第一個(gè)參數(shù)是任務(wù)處理的參數(shù)。(該方法不在UI線程執(zhí)行)
protected Boolean doInBackground(String... params)
- 第二個(gè)參數(shù)是后臺(tái)任務(wù)執(zhí)行所帶參數(shù),我們可以根據(jù)參數(shù)選擇不一樣的UI操作或者邏輯操作(該方法在UI線程執(zhí)行)
protected void onProgressUpdate(Boolean... values)
- 第三個(gè)參數(shù)后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果耐版,我們可以根據(jù)不同的doInBackground返回的參數(shù)而選擇不一樣的執(zhí)行結(jié)果(該方法在UI線程執(zhí)行)
protected void onPostExecute(Boolean aBoolean)
注意:不可以直接調(diào)用這幾個(gè)方法,一個(gè)AsyncTask只能執(zhí)行一次調(diào)用(調(diào)用execute()
)压汪,并且只能在UI線程
中實(shí)例化
和執(zhí)行
粪牲,在doInBackground
中我們調(diào)用publishProgress();
來(lái)執(zhí)行onProgressUpdate()
方法。
我們通常直接new一個(gè)匿名內(nèi)部類或者寫一個(gè)類繼承AsyncTask止剖,而我這里演示的是寫了一個(gè)抽象類實(shí)現(xiàn)AsyncTask腺阳,然后實(shí)例化該例子來(lái)使用:
WifiWhatch.java //實(shí)現(xiàn)一個(gè)監(jiān)聽(tīng)連接wifi的異步任務(wù)
...包名與導(dǎo)包
public abstract class WifiWhatch extends AsyncTask<String, Boolean, Boolean> {
private Context context;
private String SSID;
//構(gòu)造方法 傳入監(jiān)聽(tīng)連接wifi的連接名稱和上下文
public WifiWhatch(Context context, String SSID) {
this.context = context;
this.SSID = SSID;
}
@Override
protected Boolean doInBackground(String... params) {
//連接狀態(tài)
boolean conn = false;
//嘗試監(jiān)聽(tīng)次數(shù)
int i = 0;
//該方法判斷是否連接上SSID的wifi如果是返回true,否則false
conn = checkConnn(SSID, context);
if (conn) {
return true;
} else {
// 通知更新?tīng)顟B(tài)的方法
publishProgress();
}
//對(duì)該WIFI連接進(jìn)行5秒的監(jiān)聽(tīng)
for (; i < 10; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
conn = checkConnn(SSID, context);
if (conn) {
return true;
} else {
publishProgress();
}
}
return false;
}
@Override//抽象處理結(jié)果的方法
protected abstract void onPostExecute(Boolean aBoolean);
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override//抽象更新?tīng)顟B(tài)的方法
protected abstract void onProgressUpdate(Boolean... values);
//返回是否連接成功名稱為SSID的wifi
public boolean checkConnn(String SSID, Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();;
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null) {
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && wifiManager.isWifiEnabled() && wifiInfo != null) {
String ssid = wifiInfo.getSSID();
if (ssid.contains(SSID)) {
return true;
}
}
}
return false;
}
}
使用抽象類的地方代碼
//在此處調(diào)用連接連接SSID為 SSID的方法
connWIFI(SSID,PASSWORD);
//本文只演示如何使用Asynctask穿香,不探究如何連接WIFI亭引,所以就不貼出代碼
new WifiWhatch(context,SSID) {
@Override
protected void onPostExecute(Boolean aBoolean) {
if (aBoolean) {
Toast.makeText(SecondActivity.this, "連接成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(SecondActivity.this, "連接失敗", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onProgressUpdate(Boolean... values) {
Toast.makeText(SecondActivity.this, "連接中", Toast.LENGTH_SHORT).show();
}
}.execute();
如果本文包含錯(cuò)誤,或者讀者有比較好的建議皮获,歡迎指正焙蚓。