2

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); を使用して呼び出されます。

4

2 に答える 2

0

さて、私が頭の上で理解できるいくつかの理由:

  • AsyncTasks を使用すると、さまざまなスレッドが生成されるため、CPU 使用率が高くなります。スレッド自体には初期化と JVM CPU 時間が必要です (Java スレッドは JVM によって管理されることに注意してください)。
  • 同じ作業 (すべてのタスク) をより短い時間で集中させているため (スレッド化により、事実上すべてのタスクを同時に実行している)、明らかに CPU 使用率が高くなければなりません (エネルギーは生成も破壊もされず、変換されるだけです) 。 .
于 2013-08-06T10:59:58.907 に答える