Понимание потока пользовательского интерфейса

Я новичок в Android и у меня есть некоторые путаницы в отношении Android UI Thread . Теперь я знаю, что ни один поток, кроме того, который создал пользовательский интерфейс, не может его изменить.

Отлично.
Вот Activity из моего первого приложения для Android, которое меня немного смущает.

 public class NasaDailyImage extends Activity{ public ProgressDialog modalDialog = null; //------------------------------------------------------------------------------ @Override protected void onCreate(Bundle savedInstanceState){ //Instantiate progress dialog, skipping details. Button b = //get reference to button b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { modalDialog.show(); // show modal Toast.makeText(getApplicationContext(), "Getting feeds", 500).show(); new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !! } }); } //------------------------------------------------------------------------------ public synchronized void resetDisplay(boolean parseErrorOccured, boolean imageErrorOccured, IotdHandler newFeeds){ if(parseErrorOccured || imageErrorOccured){ // make a Toast // do not update display }else{ // make a Toast // update display // based on new feed } } //------------------------------------------------------------------------------ class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{ @Override protected IotdHandler doInBackground(IotdHandler... arg0) { IotdHandler handler = arg0[0]; handler.processFeed(); // get the RSS feed data ! return handler; } //------------------------------------------------------------------------------ @Override protected void onPostExecute(IotdHandler fromInBackground){ resetDisplay( // call to update the display fromInBackground.errorOccured, fromInBackground.imageError, fromInBackground); } //------------------------------------------------------------------------------ } 

1. onCreate находится в потоке пользовательского интерфейса, поэтому я могу делать все, что захочу, но onClick – нет. Почему я могу сделать ProgressDialog и Toast в этом методе? Почему нет ошибок?
2. AsyncTask является подклассом NasaDailyImage . Это означает, что он может получить доступ ко всем методам NasaDailyImage включая resetDisplay() который обновляет отображение. resetDisplay() вызывается в onPostExecute который запускается в другом потоке из пользовательского интерфейса. Итак, почему я могу обновить дисплей там и все же не получить ошибок?

  1. onClick() действительно находится в потоке пользовательского интерфейса. Большинство событий, происходящих в Activity, происходит в потоке пользовательского интерфейса.

  2. onPostExecte() (и его аналог onPreExecute() ) также работает в потоке пользовательского интерфейса. В документации AsyncTask.onPostExecte() четко указано это. AsyncTask был специально разработан таким образом, чтобы разработчики могли обновлять пользовательский интерфейс до и после выполнения фоновой работы.

В общем, ваш код будет работать в потоке пользовательского интерфейса, если вы явно не укажете его иначе. После создания AsyncTasks, Runnables или Threads вам необходимо убедиться, что вы понимаете, где выполняется ваш код. В Управлении обычно безопасно предполагать, что вы находитесь в потоке пользовательского интерфейса.

  1. Вы расширяете класс AsyncTask, где класс задачи async автоматически вызывает свой последовательный метод. Сначала onPreExecute затем doBackground и, наконец, onPost . Если вы хотите изменить любое изменение ui, вы можете использовать метод onProgressUpdate .

  2. Чтобы использовать свой класс активности, просто вызовите activityclass.this.resetDisplay() . Поскольку внутренняя область класса иногда не могла интегрироваться, кроме глобальной переменной.

благодаря