Работа с результатом асинхронной задачи

В настоящее время мое приложение обрабатывает/обрабатывало http-сообщение и некоторые другие вещи в задаче Async, а затем, когда задача завершается и вызывается onPostExecute, я попытался бы перенаправить на другой фрагмент через транзакцию фрагмента. Это оказалось довольно сложно, и я ищу альтернативы, чтобы справиться с этой ситуацией, не пытаясь зафиксировать транзакции в onPostExecute. Спасибо!

РЕДАКТИРОВАТЬ: вот метод, вызываемый из onPostExecute...

private void callback(boolean submissionSuccessful)
{
    if (submissionSuccessful)
    {
        FragmentManager fragmentManager = getActivity()
                .getSupportFragmentManager();

        Fragment f =  new CompletedFragment();

        Bundle args = new Bundle();

        args.putString("id", reportToSubmit.getReferenceId());

        f.setArguments(args);

        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, f, "completed").commit();


    }
    else
    {
        Toast.makeText(getActivity(), getResources().getString(R.string.report_error), 
                Toast.LENGTH_LONG).show();
    }
}

Причина этого следующая: пользователь завершает работу мастера (ViewPager), отправляет, во время обработки отображается диалоговое окно хода выполнения, а по завершении onPostExecute фиксирует фрагмент подтверждения, который сообщает пользователю, что процесс завершен.


person DeveryDay    schedule 12.05.2014    source источник
comment
Пожалуйста, покажите: 1. Как вы справляетесь с вещами сейчас, и 2. Что именно оказалось сложным?   -  person nhaarman    schedule 12.05.2014
comment
Я отредактировал свой исходный пост, чтобы отразить эту информацию сейчас.   -  person DeveryDay    schedule 12.05.2014


Ответы (1)


Логика выглядит неплохо. Я не уверен, что вы хотели бы изменить.

2 вещи:

  • Возможно, вы захотите указать своему Activity выполнить переход (переместить метод обратного вызова). Это отделяет этот фрагмент от второго, что считается «хорошей практикой».
  • Во-вторых, в onPostExecute ваш Fragment может быть больше не привязан к Activity, и getActivity() вернет null. Вы можете отменить AsyncTask в onPause или проверить наличие isAdded в onPostExecute.
person nhaarman    schedule 12.05.2014
comment
Странно то, что при использовании этого кода иногда, когда мой асинхронный метод выполняется, он перемещает завершенный фрагмент, и я его вижу, но в других случаях он пропускает представление завершенного фрагмента. Теперь это моя главная проблема, а также страх того, что commit() вызовет недопустимое исключение состояния, если оно случайно вызывается после вызова onsaveInstance(). - person DeveryDay; 12.05.2014