1,实现效果
子线程异步更新UI。里面使用的是线程池和handler
2,实现逻辑
-
写个类调用extends Asynctask
-
doInBackground必须重写,还需要添加onPreExecute,onPostExecute,onProgressUpdate
-
调用打开
-
AsyncTask new出来的mTask 只能执行一次
3,实现代码
TrafficTask mTask = new TrafficTask();
// 开启任务 execute方法 只能在UI线程开启
mTask.execute("haha", "hehe");
/**
* 泛型1 运行 指定doInBackground的参数类型 execute的参数类型
* 泛型2 进度 onProgressUpdate的参数类型publishProgress的参数类型
* 泛型3 结束 onPostExecute的参数类型 doInBackground的返回值类型
*
* @author Administrator
*/
private class TrafficTask extends AsyncTask<String, Integer, String> {
// 执行前走的方法 一般这里初始化一个数据 方法运行在UI线程
@Override
protected void onPreExecute() {
super.onPreExecute();
mInfos = new ArrayList<TrafficInfo>();
}
// 执行后台任务 运行在子线程
@Override
protected String doInBackground(String... params) {
// 可变参数 对应的数组
// String haha = params[0];
// String hehe = params[1];
SystemClock.sleep(1000);
// 获取包管理器
// 参1 获取额外信息的flag 如果不需要 就写0
// 获取全部安装的应用信息
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
for (PackageInfo packageInfo : installedPackages) {
// packageInfo对应menifest文件里的manifest根节点
// // 包名
// String packageName = packageInfo.packageName;
// applicationInfo对应application节点信息
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
int uid = applicationInfo.uid;
// 名字
String name = applicationInfo.loadLabel(pm).toString();
// 图片
Drawable icon = applicationInfo.loadIcon(pm);
// 根据程序的uid 获取对应的流量
long rx = TrafficStats.getUidRxBytes(uid);
long tx = TrafficStats.getUidTxBytes(uid);
TrafficInfo info = new TrafficInfo(name, icon, tx, rx);
mInfos.add(info);
// publishProgress();通知onProgressUpdate执行
}
return "{'result':'haha'}";
}
// 任务结束后执行 运行在UI线程 一般更新界面
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// 设置数据
lvTraffic.setAdapter(new TrafficAdapter());
// 进度圈消失
llLoading.setVisibility(View.INVISIBLE);
}
// 更新进度用到 运行在UI线程
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}