В моем приложении у меня есть класс для файлов UI, название которого – «SettingActivity».
Затем для выполнения некоторых заданий в фоновом режиме я привязываю этот класс пользовательского интерфейса (SettingActivity) к службе. В этой службе есть два предопределенных метода (определенные в файле .aidl), один – startTask (), другой – stopTask ().
В startTask () я сделал вызов AsyncTask. Но когда я проверил имя Looper этой AsyncTask. Это «главное». На мой взгляд, AsyncTask должен запустить другой Thread, отличный от основного Thread .
Так кто-нибудь знает, почему это происходит?
Коды заключаются в следующем:
@Override Protected void onPreExecute () { super.onPreExecute (); Log.d (TAG, «onPreExecute» + Looper.myLooper (). GetThread (). GetName ()); }
Тогда я получу основной результат.
AsyncTask имеет несколько частей: метод doInBackground
, который фактически работает в отдельном потоке и метод onPostExecute
который работает в потоке пользовательского интерфейса. Цель onPostExecute
заключается в публикации результатов (таких как обновление иерархии представлений или установка текста в текстовом представлении), которые должны выполняться в потоке пользовательского интерфейса. Он также может публиковать обновления. Чтобы все это работало правильно, необходимо создать AsyncTask и вызвать метод execute
в потоке пользовательского интерфейса.
Вы не должны вызывать действия пользовательского интерфейса из doInBackground
– это приведет к сбою вашего приложения.
На самом деле, я проверил документ android, onPreExecute (), onProgressUpdate (Прогресс …) и onPostExecute (Результат) , все «вызывается в потоке пользовательского интерфейса».
Только метод doInBackground (Params …) «вызывается в фоновом потоке».