Многопоточность Android, основной поток недоступен из Asynctask
Этот вопрос, возможно, задавался ранее, но я не мог найти об этом через мои поиски.
Я реализовал действие в своем приложении для Android, а также использовал класс Asynctask в этом упражнении. Я попытался внести некоторые изменения в свой макет из Asynctask (doInBackgroung), по этой причине я вызвал runOnUiThread из упомянутого Asynctask. Это работает правильно, но как только я перехожу к другому занятию и снова возвращаюсь к этому занятию, изменений в макете больше не происходит.
Стоит упомянуть, что я звонил asynctask.cancel(true)
при переходе к следующему действию и перестройте эту асинктаску, когда вернитесь к тому действию, которое содержит упомянутую асинктаску.
Пожалуйста, объясните мне, как справиться с этой проблемой.
1 ответ
Трудно сказать, не глядя на ваш код, но я советую вам не звонить runOnUiThread()
внутри вашего asyncTask. Вместо этого создайте интерфейс внутри класса AsyncTask и передайте свою деятельность, которая реализует интерфейс при создании класса AsyncTask. Тогда внутри onPostExecute()
проверьте, не является ли ваш слушатель (т. е. действие, которое реализует ваш интерфейс) ненулевым, и вызовите метод для этого интерфейса - тогда это будет обработано внутри реализованного метода внутри действия, в правильном потоке, где вы также можете проверить, есть ли у вас еще правильные элементы пользовательского интерфейса или найти их по id, если это необходимо.
public class MyActivity extends Activity implements OnAsyncFinishedListener {
<... activity stuff ...>
@Override
public void onAsyncFinished() {
// do stuff with your activity ui
}
}
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private OnAsyncFinishedListener mListener;
public static interface OnAsyncFinishedListener {
void onAsyncFinished();
}
public MyAsyncTask(OnAsyncFinishedListener listener) {
mListener = listener
}
<... async task stuff ...>
@Override
protected void onPostExecute(Void void) {
if (mListener != null) {
mListener.onAsyncFinished();
}
}
}