Asynctask и SetaDapter в методах Onreate
-
08-10-2019 - |
Вопрос
Я делаю некоторые задачи тяжелых сетей - загрузка фотографий (превью) - для моего главного пользовательского интерфейса не заблокировано, это сделало это на асинктюзке, я хочу поставить их в GRIDVIEW, но я устанавливаю адаптер до окончания асинктрики. Какой-то код будет более полезным
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));
}
Таким образом, в конце концов логат показывает, что все было доказано, но ничего на моем экране. Я попытался сделать сенадаптерную часть в мою асинктюзке, но это говорит мне, что: Only the original thread that created a view hierarchy can touch its views.
Что я должен делать ?
Решение
AsyncTask
Имеет полезный метод, который вы можете реализовать с именем onPostExecute()
. Отказ Это называется из исходной нити UI после завершения задачи. Вы можете использовать его, чтобы установить адаптер из правильного потока.
Другие советы
У 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()
метод.