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

AsyncTask有一个有用的方法可以实现命名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 回答