Многопоточность 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();
        }
    }
}
Другие вопросы по тегам