2012-03-19 9 views
1

AsyncTaskLoaderを使用してデータベースからデータを取り出すフラグメントがあります。フラグメントが表示されます。フラグメントはViewAnimatorで表示され、ユーザーはこのフラグメントの新しいインスタンスをViewAnimatorの前面に追加できます(しかし、ユーザーが新しいフラグメントとサイズ> 2を要求した場合、最も古いフラグメントがFragmentTransactionインスタンスを使用して削除されました)。Androidで過剰なスレッディングが悪い考えですか?

私は、ユーザーが比較的短期間で30のフラグメントをめくって30個の別々のスレッドを作成する「最悪のケース」のシナリオを想像しています。 Androidはこれらすべてのスレッドを管理できますか(それを殺すなど)か、コードを修正する必要がありますか?

各フラグメントがすべてのスレッドを使用するだけでなく、独自のスレッドを使用する理由は、modulartiyのためです。断片が自己完結しているのが一番良いと思いました。

+0

自分自身や興味のある人には:AsyncTask(AsyncTaskLoaderが使用する)は明らかに、それ自身のスレッドプールを管理しているので、すべての管理が背後から気を取られてしまいます。 –

答えて

3

過度のスレッディングは、常に悪い考えです。スレッドは大量のメモリを消費する傾向があります。そのメモリは、多くの場合、アプリケーションの実行速度が向上する他のものに使用できます。しかし、もし30がAndroidデバイス上で過度の資格を得られるかどうかは明らかではない。パフォーマンスの問題の裏側は、スレッド番号を管理する(潜在的な)複雑さです。

(あなたが起動した場合、スレッドを開始する際OOMEのは、スレッドの数は間違いなく過剰であるばかり...)

私はスレッドの数をキャップする有界スレッドプール(例えばThreadPoolExecutor)を使用してお勧めしたいですいつでも実行することができます。 (Nコアを持っていて、そのタスクがCPUにバインドされていると仮定すると、NまたはN + 1ワーカースレッド以上ではパフォーマンス上のメリットはありません)。ただし、タスク間のスケジューリング/有限のスレッドプールは、スケジュールに起因するデッドロックにつながる可能性があります。

+0

良い答えをありがとう。アプリケーションが固定サイズのスレッドプールを標準で別に持つかどうか知っていますか? –

+1

いくつかありますが、そうではありません。アプリケーション要件によって異なります。ただし、「並行して」実行するタスクが多数ある可能性がある場合は、一般的な方法です。有界スレッドプールは実際には2つの目的を果たします。つまり、スレッド数を制限し、スレッドの再作成によるスレッド作成/破棄のオーバーヘッドを削減します。 –

関連する問題