doInBackground で 100 項目のシリアル化されたファイルを読み取り、ArrayList を作成して doInBackground から戻る小さなコードがあります。PostExecute では、ListView アダプターに関連付けられている別の ArrayList オブジェクトに配列リストをコピーするだけです。
これにより、10秒のタイマーでCPU使用率が10〜40%になりました。
非同期タスクを削除し、doInackgrounf と postExecute を UI スレッドで連続して実行しました。トップ コマンドの出力では常に CPU が 5% 未満です。
SOは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); を使用して呼び出されます。