AsyncTask的使用

作者: 碎念枫子 | 来源:发表于2016-07-25 14:47 被阅读388次

    AsyncTask是一个简单轻量级的异步处理类。
    AsyncTask定义了三种泛型类型ParamsProgressResult
    如: AsyncTask<String, Boolean, Boolean>

    • 第一个参数是任务处理的参数。(该方法不在UI线程执行)
    protected Boolean doInBackground(String... params)
    
    • 第二个参数是后台任务执行所带参数,我们可以根据参数选择不一样的UI操作或者逻辑操作(该方法在UI线程执行)
    protected void onProgressUpdate(Boolean... values)
    
    • 第三个参数后台执行任务最终返回的结果,我们可以根据不同的doInBackground返回的参数而选择不一样的执行结果(该方法在UI线程执行)
    protected void onPostExecute(Boolean aBoolean)
    

    注意:不可以直接调用这几个方法,一个AsyncTask只能执行一次调用(调用execute()),并且只能在UI线程实例化执行,在doInBackground中我们调用publishProgress();来执行onProgressUpdate()方法。

    我们通常直接new一个匿名内部类或者写一个类继承AsyncTask,而我这里演示的是写了一个抽象类实现AsyncTask,然后实例化该例子来使用:

    WifiWhatch.java //实现一个监听连接wifi的异步任务

    ...包名与导包
    public abstract class WifiWhatch extends AsyncTask<String, Boolean, Boolean> {
        private Context context;
        private String SSID;
    
       //构造方法 传入监听连接wifi的连接名称和上下文
        public WifiWhatch(Context context, String SSID) {
            this.context = context;
            this.SSID = SSID;
        }
    
        @Override
        protected Boolean doInBackground(String... params) {
            //连接状态    
            boolean conn = false;
          //尝试监听次数
            int i = 0;
          //该方法判断是否连接上SSID的wifi如果是返回true,否则false
            conn = checkConnn(SSID, context);
    
            if (conn) {
                return true;
            } else {
    //        通知更新状态的方法
                publishProgress();
            }
            //对该WIFI连接进行5秒的监听
            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//抽象处理结果的方法
        protected abstract void onPostExecute(Boolean aBoolean);
    
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    
        @Override//抽象更新状态的方法
        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;
        }
    
    }
    

    使用抽象类的地方代码

    //在此处调用连接连接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();
    

    如果本文包含错误,或者读者有比较好的建议,欢迎指正。

    相关文章

      网友评论

        本文标题:AsyncTask的使用

        本文链接:https://www.haomeiwen.com/subject/bxvgjttx.html