2

私は Android 開発者の Web サイトを調べて、いくつかの記事を読んでいます。AsyncTask を使用して、リスト ビューで画像の読み込みを遅らせる 1 つの方法があります。

// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // If this item hasn't been recycled already, hide the
            // progress and set and show the image
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }
}.execute(holder);

ただし、私には、そのコードには少し問題があるようです。たとえば、インターネットから画像を読み込み、読み込みに数秒かかるとします。

ユーザーとして、リストをスクロールしてから別のアクティビティに切り替えると、バックグラウンドで実行されているいくつかの AsyncTasks があり、帯域幅を消費しますが、新しいフォアグラウンド アクティビティで必要になる可能性があります。

彼らのアプローチを使用して、通常、そのケースをどのように処理しますか? ビューをリサイクルするときに、ホルダーに関連付けられている AsyncTask を強制終了しますか? どの AsyncTasks がまだ実行されているかをアダプターで追跡し、アクティビティーが停止したときにそれらをすべてキャンセルしますか? それを行う他の方法はありますか?

私の質問は主に、その問題を解決するために部品をクリーニングするアーキテクチャについてです (実装ではありません)。

4

1 に答える 1

2

ほとんどの場合、これが問題になるのに十分な時間はダウンロードにかかりませんが、問題が発生する場合はそれらを強制終了する必要があります。また、実装では、画像をダウンロードし、ビューが再利用されているかどうかを確認します。遅延が長い場合は、再利用するときにタスクをキャンセルする必要があります。タスクの実行順序は、Android のバージョンによって異なることに注意してください。ドキュメントから:

最初に導入されたとき、AsyncTasks は単一のバックグラウンド スレッドでシリアルに実行されました。DONUT 以降、これはスレッドのプールに変更され、複数のタスクが並行して動作できるようになりました。HONEYCOMB 以降、並列実行によって発生する一般的なアプリケーション エラーを回避するために、タスクは単一のスレッドで実行されます。

本当に並列実行が必要な場合は、THREAD_POOL_EXECUTOR を使用して executeOnExecutor(java.util.concurrent.Executor, Object[]) を呼び出すことができます。

于 2012-09-19T17:18:44.057 に答える