AsyncTask и setAdapter в методах onCreate - PullRequest
4 голосов
/ 11 ноября 2010

Я выполняю некоторые тяжелые сетевые задачи - скачиваю картинки (превью) - Чтобы мой основной пользовательский интерфейс не был заблокирован, он сделал это в 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 показывает, что все было загружено, но ничего на моем экране. Я попытался выполнить часть setAdapter в моей AsyncTask, но он говорит мне, что: Only the original thread that created a view hierarchy can touch its views.

Что мне делать?

Ответы [ 2 ]

6 голосов
/ 11 ноября 2010

AsyncTask имеет полезный метод, который вы можете реализовать с именем onPostExecute(). Он вызывается из исходного потока пользовательского интерфейса после выполнения задачи. Вы можете использовать его для установки адаптера из правильной нити.

4 голосов
/ 11 ноября 2010

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().

...