AsyncTask是一个简单轻量级的异步处理类。
AsyncTask定义了三种泛型类型Params
,Progress
和Result
。
如: 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();
如果本文包含错误,或者读者有比较好的建议,欢迎指正。