Болезненная резьба в андроиде

Мой ожидаемый результат – в первом запуске появится диалоговое окно прогресса, ожидающее загрузки фонового потока содержимого. Диалог отклоняется после того, как рабочий поток выполнил задание. Я выполнил поиск и получил это решение. Как отобразить диалог прогресса перед началом активности в Android?

Это мой полный код:

private ManagerApplication app; private ImageAdapter adapter; private GridView gridview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setupView(); } private void setupView() { gridview = (GridView) findViewById(R.id.gridview); app = (ManagerApplication) getApplication(); ProgressDialog progress = new ProgressDialog(this); progress.setMessage("Loading..."); new LoadImageTask(progress, this).execute(); } private class LoadImageTask extends AsyncTask<Void, Void, Void> { private ProgressDialog progress; private Context context; public LoadImageTask(ProgressDialog progress, Context context) { this.progress = progress; this.context = context; } @Override protected void onPreExecute() { super.onPreExecute(); progress.show(); } @Override protected Void doInBackground(Void... params) { adapter = new ImageAdapter(app.getShoes(), context); gridview.setAdapter(adapter); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); progress.dismiss(); } } 

Однако мое приложение вылетает из-за того, что «Только оригинальный поток, создавший иерархию представлений, может коснуться его представлений». Я полагаю, что что-то заблокировало основной поток пользовательского интерфейса, но его все еще очень неясно. Так может ли кто-нибудь указать мне на проблему? благодаря

DoinBackground – это не UI Thread, поэтому никогда не обновляйте какой-либо пользовательский интерфейс (вид) в этом методе …

И использовать OnPostExecute or OnProgressUpdate for update UI

  @Override protected Void doInBackground(Void... params) { //here just background task , //its non UI Thread so dont set ant view here set it in OnPostExecute,... return null; } 

Вызвать asynctask из настройки

 private void setupView() { gridview = (GridView) findViewById(R.id.gridview); app = (ManagerApplication) getApplication(); new LoadImageTask(progress, this).execute(); } 

И создать ProgressDilog в OnPreExecute method

 ProgressDialog progress; @Override protected void onPreExecute() { super.onPreExecute(); progress = new ProgressDialog(this); progress.setMessage("Loading..."); progress.show(); } 

И в onPostExecute dismiss it

Как ни странно, есть статья « Безболезненная резьба», которую вы должны прочитать. Вы не должны пытаться манипулировать представлениями в doInBackground . В вашем случае вы можете вызвать app.getShoes() но не делайте настройки адаптера там.