0

大きなビットマップを構成する多数のタイルをロードするシングル スレッド アプリを最適化しようとしています。新しいタイルをシステム メモリにロードするときに、アプリの動作が非常に遅くなっていました。この目的で非同期タスクを使用しようとしています。アプリは、onDraw によって呼び出されるメソッドで左上にあるタイルを検出し、Assets フォルダーにビットマップのパスを含む文字列を作成し、描画する前にビットマップが null かどうかを確認します。null の場合は、メモリにロードします。私のアイデアは、DoBackground でビットマップを処理し、postExecute でビューの無効化をトリガーして、非同期に読み込まれたビットマップを表示することでした。いくつかの質問:

1.) ビットマップごとに aSync タスクを実行できますか? (このステートメント: new myAsyncTaskManager().execute(bitmapPath); そうでない場合、aSync が行う唯一のことはビットマップをメモリにロードすることだけなので、最善の方法は何でしょうか?

2.) ビットマップの読み込みが遅すぎる場合、優先度 aSyncTask を設定することは可能ですか?

3.) これを行うためのより良い方法はありますか? アプリの速度を低下させるのはキャンバスの描画ではなく、ビットマップの読み込みであることは確かです。

私の一時的な aSync コード:

private class myAsyncTaskManager extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... bitmapPath) {
      Log.e("sys","i ran using aTask");
        try {

            bitmapArray[rectBeingDrawn] = BitmapFactory.decodeStream(assetManager.open(imagePathToLoad));


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       return null;
}


@Override
protected void onPostExecute(String result) {
    // execution of result of Long time consuming operation
    mCampusMap.invalidate();
}
}
4

2 に答える 2

2

ちょっと待って、bitmapLoaderThread.run() を呼び出しているのですか? これらはコンテキストのないコード スニペットであるため (どのスレッドで何かが実行されているのか? どの関数が実行されているのか?)、何が起こっているのかを理解するのはちょっと難しいですが、run() を呼び出さないでください - それはオペレーティング システムの仕事です! 新しいスレッドを開始するには、start() を呼び出します。これにより、新しいスレッドが作成され、その run() 関数が呼び出されます。run を直接呼び出す場合でも、自分のスレッドで呼び出していることになります。

それ以外 - 2 つのスレッド間のハンドシェイクをどのように行うのですか? ワーカー スレッドは、ビットマップが読み込まれたことをメイン スレッドにどのように通知しますか? そのためにハンドラーを使用するか、スレッド全体の代わりに AsyncTask を使用できます。

于 2010-08-04T03:50:56.197 に答える
2

まったく新しい質問に新しい回答を追加します:)

  1. ビットマップの量に依存します。いくつ持っていますか?何十ものスレッドを作成したくありません。結局のところ、ハードウェアにはコアが 1 つしかないため、複数のスレッドを使用しても何も得られません。コンテキストの切り替えによって、それがかき消されるだけです。大量のビットマップがある場合は、ビットマップのキューを作成して処理したい場合があります。そのためには、スレッドとハンドラーの方が実際には優れています。

  2. です。通常、ワーカー スレッドはメイン スレッドよりも 1 つ低い優先度レベルに設定します。

于 2010-08-04T05:56:21.590 に答える