Как мне закрыть диалоговое окно прогресса с асинхронной задачей и избежать "ошибка выполнения вашей активности?" - PullRequest
0 голосов
/ 12 марта 2019

У меня возникают проблемы при попытке избежать "Невозможно добавить окно - токен android.os.BinderProxy недействителен; ваша деятельность запущена?" исключение при использовании диалогового окна хода выполнения с асинхронной задачей.

final ProgressDialog nDialog = new ProgressDialog(MainActivity.this);
    nDialog.setMessage("Loading...");
    nDialog.setIndeterminate(false);
    nDialog.setCancelable(false);
    if(!isFinishing()){nDialog.show();}

Затем я продолжаю:

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
           //Run code while showing progress dialog
           ndialog.dismiss
}
    }, 1000);

Я понял, что иногда получаю исключение, потому что действие будет завершено, пока идет доступ к ndialog. Таким образом, решение, похоже, изменить ndialog.

Первоначальная проблема с отображением диалога после завершения действия (что случается редко) решается с помощью

if(!isFinishing()){nDialog.show();}

Я подумывал над тем, чтобы поместить этот код в nDialog.dismiss. Но проблема в том, что если я сделаю:

if(!isFinishing()){nDialog.dismiss();}

и действие заканчивается до того, как оно может быть запущено, пользователь застревает с диалоговым экраном, который никогда не будет отклонен.

Я что-то упустил? Как я могу предотвратить эту ошибку, но в то же время убедиться, что диалог запустится и будет закрыт?

Спасибо!

1 Ответ

1 голос
/ 12 марта 2019

Осторожно при обработке представлений, действий и других связанных объектов пользовательского интерфейса из другого потока.Потоки, такие как AsyncTask, не знают о жизненном цикле активности, и вы можете в конечном итоге отправлять сообщения в мертвые окна.Я считаю, что это то, что происходит с вами.

Более безопасный способ сделать это:

import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.lang.ref.WeakReference;

public class MyTask extends AsyncTask<Void, Void, Void> {

private final WeakReference<MyActivity> weakReferenceActivity;

public MyTask(@NonNull MyActivity activity) {
    this.weakReferenceActivity = new WeakReference<>(activity);
}

@Nullable
public MyActivity getActivity() {
    MyActivity activity = weakReferenceActivity.get();
    if (activity.isDestroyed()) {
        return null;
    }
    return activity;
}

@Override
protected void onPreExecute() {
    MyActivity activity = getActivity();
    if (activity != null) {
        activity.showProgressDialog();
    }
}

@Override
protected Void doInBackground(Void... voids) {
    [do something]
    return null;
}

@Override
protected void onPostExecute(Void nothing) {
    MyActivity activity = getActivity();
    if (activity != null) {
        activity.hide();
    }
}
}
...