0

重い画像を取得し、サイズを変更してにロードする必要があるアクティビティがありますGridView。このフェッチ、サイズ変更のすべてのプロセスには時間がかかるため、別の からこの画面を読み込もうとするとACtivity、遅延が発生します。

この「グリッド アクティビティ」のコンテンツを最初にロードし、すべての画像がロードされた後にのみ開くにはどうすればよいですか?

を使用していstartActivityForResultますか?これが解決策である場合、GridViewスクロール時に画像をロードしてからすべての画像がロードされたことをどのように検出できますか。

編集

AsyncTask以前に何十回も使用したものを使用するように提案されました。しかし、何かが私を混乱させます。

  1. カスタム アダプターの初期化を AsyncTask に送信する必要がありますか?

    mGridView = (GridView) findViewById(R.id.gridview);
    mImageAdapter = new ImageAdapter(this);
    mGridView.setAdapter(mImageAdapter);
    
  2. または、カスタムアダプター内、つまりメソッド内で非同期タスクを実行しgetView、各グリッドビューセルで my への新しい呼び出しを作成する必要がありますAsyncTaskか?

4

2 に答える 2

1

AsyncTaskフェッチとサイズ変更のすべてのコードをメソッドに入れることで を使用doInBacgroundできます。データをオブジェクト ( の である場合もあります) に保存ArrayListBitmapて、メソッドに返すことができます ( AsyncTask ジェネリック型onPostExecuteを参照してください)。

ImageAdapter次に、取得したオブジェクトをパラメーターとしてコンストラクターに追加して、コンストラクターを変更する必要もAsyncTaskあります。

public class DownloadPdfTask extends AsyncTask<Void, Integer, ArrayList<Bitmap>> {
    private ArrayList<Bitmap> images;
    @Override
    protected ArrayList<Bitmap> doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        /** your long task here, and set "images" **/
        return images;
    }

    @Override
    protected void onPostExecute(ArrayList<Bitmap> images) {
        // TODO Auto-generated method stub
        super.onPostExecute(images);
        mGridView = (GridView) findViewById(R.id.gridview);
        mImageAdapter = new ImageAdapter(this, images); // new construcor
        mGridView.setAdapter(mImageAdapter);
    }

}

imagesAdapter で必要に応じてリストを使用してください。

于 2013-08-28T21:58:31.110 に答える