Отображение диалога от перехватчика Retrofit - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь отобразить диалог от перехватчика Retrofit, когда несколько параметров не удовлетворены. Но я получил исключение android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? при попытке показать диалог.

Вот мой код.

final AlertDialog.Builder alertDialog = new AlertDialog.Builder(ShieldSquare.applicationContext)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle("Are you sure to Exit")
            .setMessage("Exiting will call finish() method")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                }
            })
            //set negative button
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //set what should happen when negative button is clicked
                    Toast.makeText(ShieldSquare.applicationContext,
                            "Nothing Happened", Toast.LENGTH_LONG).show();
                }
            });

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            alertDialog.create().show();
        }
    };

    new Handler(Looper.getMainLooper()).post(runnable);

Выше кода, запущенного на Interceptor, перед продолжением цепи Retrofit.

ssResponse = chain.proceed(originalRequest);

1 Ответ

0 голосов
/ 03 июля 2018

Как правило, мы отображаем диалоги только из действий, поэтому контекст ShieldSquare.applicationContext не может показать AlertDialog.

Существует два метода, которые могут удовлетворить ваши потребности:

Первый , используйте специальное разрешение android.permission.SYSTEM_ALERT_WINDOW. Перед вашим alertDialog.show(); добавьте:

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

И добавить разрешение ниже к AndroidManifest.xml.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Тогда вы можете использовать ShieldSquare.applicationContext для построителя диалогов.

Второй , вы можете обновить ShieldSquare.applicationContext до самого последнего действия, тогда ShieldSquare.applicationContext всегда будет контекстом действия:

public abstract class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ShieldSquare.applicationContext = this;
    }
}

И я нашел несколько подходов к использованию BroadcastReceiver для отображения диалогов, вы также можете посмотреть, посмотреть ответ SO и это сообщение в блоге .

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