onCreate方法中的AsyncTask和setAdapter

时间:2010-11-11 12:20:23

标签: android android-asynctask android-sdk-2.1 android-gridview

我正在做一些繁重的网络任务 - 下载图片(预览) - 对于我的主要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.

我该怎么办?

2 个答案:

答案 0 :(得分:6)

AsyncTask有一个有用的方法,您可以实现名为onPostExecute()的方法。在任务完成后从原始UI线程调用它。您可以使用它从正确的线程设置适配器。

答案 1 :(得分: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()方法中下载了。