В Android, нормально ли читать значения, существующие в потоке пользовательского интерфейса (например, поля элемента подкласса Activity), из AsyncTask.doInBackground()
, просто не пытайтесь их записать? Или чтение должно выполняться только в AsyncTask.onPostExecute()
?
В идеале вы не касаетесь действия в doInBackground()
AsyncTask
. Причина: изменение конфигурации (например, поворот экрана). Активность может быть заменена, пока поток прерывается, и поэтому вы можете завершить чтение из-за неправильного действия.
Если вы следуете рецепту, который я описываю в этом ответе на протяжении, и вы синхронизируете доступ к Activity
, удерживаемому AsyncTask
, вы будете получить как можно больше результатов. Разумеется, вам также придется иметь дело с безопасностью потоков независимо от того, что вы читаете ( "например, полями подкласса Activity" ), поскольку они могут быть или не быть потокобезопасными уже.
onPostExecute()
?onPostExecute()
вызывается в главном потоке приложения. И, если вы будете следовать рецепту, с которым я связан выше, экземпляр действия в задаче будет правильным ко времени выполненияonPostExecute()
.