Выполняются ли onPreExecute () и onPostExecute () в потоке пользовательского интерфейса или в потоке, из которого запускается AsyncTask?

Я AsyncTask давно писал AsyncTask для коротких фоновых операций в android и имел очень простой вопрос. Если я запустил AsyncTask из отдельного потока, а не из основного потока пользовательского интерфейса, мои onPreExecute() и onPostExecute будут по-прежнему вызываться в потоке пользовательского интерфейса или потоке, из которого я запустил AsyncTask . Мне любопытно, потому что я не смог показать всплывающее окно внутри onPreExecute() когда я начал его из какого-то другого потока.

EDIT 2

 I tried writing this simple activity to try: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { final TestAsyncTask task = new TestAsyncTask(); task.execute(); } }).start(); } private class TestAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... voids) { return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); Toast.makeText(MainActivity.this, "Yo!", Toast.LENGTH_LONG).show(); } } } 

Это нормально. Но когда я запускаю приложение со следующим кодом:

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { final TestAsyncTask task = new TestAsyncTask(); task.execute(); } }).start(); } private class TestAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(MainActivity.this, "Yo!", Toast.LENGTH_LONG).show(); } @Override protected Void doInBackground(Void... voids) { return null; } } } 

Он не работает со следующей ошибкой:

 Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

Как одна из строк в трассировке стека.

Хотя документы говорят, что эти обратные вызовы выполняются в основном потоке – это неверно. onPreExecute() выполняется синхронно с executeOnExecutor() то есть в потоке, запускающем AsyncTask .

onPostExecute() всегда запускается в основном потоке. (Он вызывается из finish() , и это происходит внутри Handler который использует looper основного потока).

Вы должны сделать обновления UI и оповещения или всплывающие подсказки в методе onPostExecute () AsyncTask, который работает в потоке пользовательского интерфейса. Метод doinBackground () AsyncTask работает в другом потоке.

Цитирование официальных документов:

 onPostExecute Added in API level 3 void onPostExecute (Result result) Runs on the UI thread after doInBackground(Params...). The specified result is the value returned by doInBackground(Params...). onPreExecute Added in API level 3 void onPreExecute () Runs on the UI thread before doInBackground(Params...). 

Вы можете найти его здесь https://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)

Делайте в фоновом режиме фоновый поток, в то время как OnPreExecute и OnPostExecute запускаются на главной ветке Ui.

Intereting Posts
Объект Greendao при сериализации с использованием GSON не содержит связанного объекта в строке Generated JSON Не может скомпилировать приложение Android с областью Android, вызывающая активность внутри себя Android Espresso – нажмите на элемент навигационного элемента с изображением и текстом Получил Null String, получая данные из EditText в android Замена драйвера сенсорного экрана в Android-ядре Android: setResult не работает Как и что преобразует java-байт-код в файл Android dex Как использовать кнопки диалога диалогового окна стиля головоломки Android Конвертировать Bitmap в Mat после захвата изображения с помощью камеры Android Как достичь пользовательского интерфейса Android, как этот макет изображения? О пользователе android: clipChildren Создание двух APK с одного Android-источника-дерева Как добавить подсказку в spinner в XML Textureview получить поверхность Как получить доступ к контактам в моей программе Android