AsyncTask的使用

AsyncTask是一個(gè)簡單輕量級的異步處理類。
AsyncTask定義了三種泛型類型ParamsProgressResult。
如: AsyncTask<String, Boolean, Boolean>

  • 第一個(gè)參數(shù)是任務(wù)處理的參數(shù)。(該方法不在UI線程執(zhí)行)
protected Boolean doInBackground(String... params)
  • 第二個(gè)參數(shù)是后臺任務(wù)執(zhí)行所帶參數(shù),我們可以根據(jù)參數(shù)選擇不一樣的UI操作或者邏輯操作(該方法在UI線程執(zhí)行)
protected void onProgressUpdate(Boolean... values)
  • 第三個(gè)參數(shù)后臺執(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();來執(zhí)行onProgressUpdate()方法。

我們通常直接new一個(gè)匿名內(nèi)部類或者寫一個(gè)類繼承AsyncTask,而我這里演示的是寫了一個(gè)抽象類實(shí)現(xiàn)AsyncTask,然后實(shí)例化該例子來使用:

WifiWhatch.java //實(shí)現(xiàn)一個(gè)監(jiān)聽連接wifi的異步任務(wù)

...包名與導(dǎo)包
public abstract class WifiWhatch extends AsyncTask<String, Boolean, Boolean> {
    private Context context;
    private String SSID;

   //構(gòu)造方法 傳入監(jiān)聽連接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)聽次數(shù)
        int i = 0;
      //該方法判斷是否連接上SSID的wifi如果是返回true,否則false
        conn = checkConnn(SSID, context);

        if (conn) {
            return true;
        } else {
//        通知更新狀態(tài)的方法
            publishProgress();
        }
        //對該WIFI連接進(jìn)行5秒的監(jiān)聽
        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à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ò)誤,或者讀者有比較好的建議,歡迎指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容