4

私はいくつかの重いネットワーク タスクを実行しています - 写真 (プレビュー) をダウンロードします - 私のメイン UI がブロックされないようにするために、AsyncTask でそれを行いました。それらを GridView に入れたいのですが、AsyncTask が終了する前にアダプターを設定します。いくつかのコードはより役立つでしょう

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.gridview);
            new LoadAllPictures().execute();
            GridView g = (GridView) findViewById(R.id.gridview);
            g.setAdapter(new ImageAdapter(this));
}

最後に、Logcat はすべてがダウンロードされたことを示しますが、画面には何も表示されません。AsyncTask で setAdapter 部分を実行しようとしましたが、次のように表示されます。Only the original thread that created a view hierarchy can touch its views.

私は何をすべきか ?

4

2 に答える 2

6

AsyncTasknamed を実装できる便利なメソッドがありますonPostExecute()。タスクが完了した後、元の UI スレッドから呼び出されます。これを使用して、正しいスレッドからアダプターをセットできます。

于 2010-11-11T12:34:12.793 に答える
4

AsyncTask には 3 つの基本的なメソッドがあります。

protected void onPreExecute()
{
}

protected void onPostExecute(Void unused)   
{
  // displaying images
  // set adapter for listview with downloaded items
}

protected Void doInBackground(Void... params) 
{
     // downloading and time consuming task 
}

この時点で、画像は既にメソッド内にダウンロードされているためg.setAdapter(new ImageAdapter(this));、メソッド内に書き込むことができます。onPostExecute(Void unused)doInBackground()

于 2010-11-11T12:36:37.183 に答える