Выполнять код UI-потоке в Android-приложении можно разными способами: MainActivity.this.runOnUiThread(new Runnable(){ public void run(){ Log.d("UI thread", "I am the UI thread") } }) или MainActivity.this.myView.post(new Runnable(){ public void run(){ Log.d("UI thread", "I am the UI thread") } }) или private class BackgroundTask extends AsyncTask { protected void onPostExecute(Bitmap result) { Log.d("UI thread", "I am the UI thread") } } В чем различия между этими способами?
Ответ Разница в последовательности выполнения:
1) Выполнится мгновенно если запущено из UiThread, и будет поставлено в очередь на выполнение если запущено из параллельного потока. //Пример для UiThread Log.e("_","1") MainActivity.this.runOnUiThread(() -> Log.e("_","2")}}) Log.e("_","3") //Вывод 1 2 3
2) Всегда будет поставлено в очередь на выполнение (не зависимо от потока). //Пример Log.e("_","1") MainActivity.this.myView.post(() -> Log.e("_","2")}}) Log.e("_","3") //Вывод 1 3 2
3) Сначала запустит отдельный поток, а после его завершения поставит в очередь на выполнение. //Пример Log.e("_","1") new AsyncTask(){ @Override protected void onPostExecute(Void aVoid) { Log.e("_","2") } }.equals() MainActivity.this.myView.post(() -> Log.e("_","3")}}) Log.e("_","4") //Вывод 1 4 3 2