Невозможно добавить окно — токен android.os.BinderProxy

#android #android-alertdialog #android-windowmanager

#Android #android-alertdialog #android-windowmanager

Вопрос:

Ниже приведен мой служебный метод отображения диалогового окна оповещения в моем приложении

 private void displayInternetAlert(final Context context) {
        if (!((GlobalActivity) context).isFinishing() amp;amp; context instanceof GlobalActivity) {
            ((GlobalActivity) context).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (Validator.isNull(internetDialog)) {
                        internetDialog = new AlertDialog.Builder(Util.createCustomAlertDialog(context)).create();
                        internetDialog.setMessage(context.getString(R.string.internet_disable));
                        internetDialog.setButton(DialogInterface.BUTTON_NEUTRAL, context.getString(R.string.settings), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                /*
                Don't need to write onactivity result now as we try to connect every time
                 */
                                context.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                                dialog.dismiss();
                            }
                        });
                        internetDialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.ignore), new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });
                        internetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
                            @Override
                            public void onShow(DialogInterface dialog) {
                                internetDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(context.getResources().getColor(R.color.dialog_cancel_button));
                                internetDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTypeface(null, Typeface.BOLD);
                                internetDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(context.getResources().getColor(R.color.dialog_cancel_button));
                            }
                        });
                    }
                    if (!internetDialog.isShowing()) {
                        internetDialog.show();
                    }
                }
            });
        }
    }
 

а ниже приведен мой класс GlobalActivity

 public class GlobalActivity extends AppCompatActivity {
    @Nullable
    @Bind(R.id.adView)
    public AdView adView;

    public GlobalActivity() {
        ExceptionHandler.getExceptionHandler().setActivity(this);
    }

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setContentView(R.layout.ad_system);
        ButterKnife.bind(this);
    }

    @Override
    protected void finalize() throws Throwable {

    }

    @Override
    protected void onStart() {
        super.onStart();
        loadGoogleAdd();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(Validator.isNotNull(adView)){
            adView.resume();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(Validator.isNotNull(adView)){
            adView.pause();
        }
        Util.setSharedPreferences(this, Util.SHARED_PREFERENCE_PREFERENCES, Util.EXPOSE_GSON.toJson(Util.getPreferences(this)));

    }

    private void loadGoogleAdd() {
        if (adView != null) {
            AdRequest adRequest = new AdRequest.Builder().
                    addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                    .build();
            adView.loadAd(adRequest);
        }
    }

    public void loadErrorActivity() {
        startActivity(new Intent(GlobalActivity.this, ErrorActivity.class));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(Validator.isNotNull(adView)){
            adView.destroy();
        }
        Request.getRequest().dismissProgressDialog(this);
    }
}
 

из которого я расширяю все действия, и в этом действии я заменяю фрагменты, хотя я проверил завершение действия.

Но я все еще получаю это исключение в SM-G935F (Samesung Galaxy s7 edge). Я использую appcompat 23.1.1. это проблема, связанная с платформой или устройством, или я совершаю какую-либо ошибку, пожалуйста, помогите мне найти решение для этого.

Любая помощь приветствуется.

Ответ №1:

Я не думаю, что возможно отобразить диалоговое окно из фонового потока, поскольку метод предположения displayInternetAlert вызывается внутри activity / fragment, вы можете отобразить диалоговое окно напрямую следующим образом:

 private void displayInternetAlert(final Context context) {
    if (!((GlobalActivity) context).isFinishing() amp;amp; context instanceof GlobalActivity) {
            if (Validator.isNull(internetDialog)) {
                internetDialog = new AlertDialog.Builder(Util.createCustomAlertDialog(context)).create();
                internetDialog.setMessage(context.getString(R.string.internet_disable));
                internetDialog.setButton(DialogInterface.BUTTON_NEUTRAL, context.getString(R.string.settings), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
        /*
        Don't need to write onactivity result now as we try to connect every time
         */
                        context.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                        dialog.dismiss();
                    }
                });
                internetDialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.ignore), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                internetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
                    @Override
                    public void onShow(DialogInterface dialog) {
                        internetDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(context.getResources().getColor(R.color.dialog_cancel_button));
                        internetDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTypeface(null, Typeface.BOLD);
                        internetDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(context.getResources().getColor(R.color.dialog_cancel_button));
                    }
                });
            }
            if (!internetDialog.isShowing()) {
                internetDialog.show();
            }
        }
}