Совершенно верно, что любые, возможно, длительные операции должны выполняться в отдельных потоках. И AsyncTask
- хороший способ решения подобных проблем, поскольку он также дает вам простой способ синхронизировать вашу задачу с потоком пользовательского интерфейса. Это ответ на ваш первый вопрос.
Теперь по поводу обновления потока пользовательского интерфейса, чтобы показать вашим пользователям, что ваше приложение не застряло. Поскольку методы AsyncTask
onPreExecute()
и onPostExecute()
работают внутри потока пользовательского интерфейса, вы можете легко создавать, запускать и останавливать ProgressDialog
с или ProgressBar
с. Если вы хотите показать текущий ход выполнения задачи, вы должны вызвать метод publishProgress(int)
внутри doInBackground()
, а затем использовать его внутри AsyncTask
s onProgressUpdate()
метода. Там вы можете, например, обновить свой ProgressDialog
.
А чтобы получить результат из AsyncTask, вы можете либо вызвать его метод get()
(это синхронный вызов), либо внедрить некоторый интерфейс обратного вызова, который сообщит активности о завершении задачи.
Я надеюсь, что ответ достаточно ясен, если нет - не стесняйтесь задавать больше вопросов. Надеюсь, это поможет.
РЕДАКТИРОВАТЬ
Создайте интерфейс с именем, например, onFetchFinishedListener
с одним методом - void onFetchFinished(String)
. Ваша деятельность, которая запускает AsyncTask
, должна реализовывать этот интерфейс. Теперь создайте конструктор внутри вашего AsyncTask
, который принимает объект OnFetchFinishedListener
в качестве аргумента, и при создании экземпляра AsyncTask
внутри вашей деятельности отправьте ссылку на Activity
в качестве аргумента (поскольку он реализует OnFetchFinishedListener
). Затем, когда ваша задача будет завершена внутри doInBackground()
, вызовите onFetchFinished()
на мероприятии. Теперь внутри onFetchFinished(String)
метода вашего Activity
вы можете использовать String
(или другой объект), который вызывается с обратным вызовом. Опять же, надеюсь, я был достаточно ясен.