我有一个小代码,我在 doInBackground 中读取了一个包含 100 个项目的序列化文件,创建了一个 ArrayList 并从 doInBackground 返回。在 PostExecute 中,我只是将数组列表复制到另一个与 ListView 适配器绑定的 ArrayList 对象。
有了这个,我用 10 秒的计时器获得了 10-40% 的 cpu 使用率。
我删除了异步任务,并在 ui 线程中连续执行了 doInackgrounf 和 postExecute 工作,并且在顶级命令输出中我总是 < 5% cpu。
那么 AsyncTask cpu 饿了吗?
下面的更新是 myAsyncTask 中的代码
class MyAsyncTask extends AsyncTask<String, String, ArrayList<Info>> {
@Override
protected ArrayList<Info> doInBackground(String... params) {
ArrayList<Info> arr_list = new ArrayList<Info>() {
};
try {
File f = new File(mainApp.getFilesDir(), "");
String[] paths = f.list();
ArrayList<String> delfiles = new ArrayList<String>() {
};
long n = 0;
if (paths == null)
return arr_list;
for (int i = 0; i < paths.length; i++) {
try {
long fname = Long.valueOf(paths[i]);
if (fname > n)
n = fname;
delfiles.add(paths[i]);
} catch (Exception e) {
continue;
}
}
lastFileNum = n;
if (n > 0) {
File fp = new File(mainApp.getFilesDir(), String.valueOf(n));
FileInputStream fos = new FileInputStream(fp);
ObjectInputStream os;
os = new ObjectInputStream(fos);
int count = (Integer) os.readObject();
for (int i = 0; i < count; i++) {
Info ai = (Info) os.readObject();
arr_list.add(ai);
}
os.close();
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return arr_list;
}
@Override
protected void onPostExecute(ArrayList<Info> arr_list) {
try{
if (this.isCancelled()) {
return;
}
if (arr_list != null && arr_list.size() > 0) {
if (this.isCancelled()) {
return;
}
mainApp.Info_data.clear();
for (int i = 0; i < arr_list.size(); i++) {
mainApp.Info_data.add(arr_list.get(i));
}
if (this.isCancelled()) {
return;
}
if (this.isCancelled()) {
return;
}
adapter.notifyDataSetChanged();
}
if (this.isCancelled()) {
return;
}
}
catch(Exception e){
}
}
}
并使用 matk.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, str); 调用