无法添加窗口 - 令牌android.os.BinderProxy

时间:2016-10-17 07:20:00

标签: android android-alertdialog android-windowmanager

以下是我在应用程序中显示警告对话框的实用程序方法

private void displayInternetAlert(final Context context) {
        if (!((GlobalActivity) context).isFinishing() && 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边缘)中收到此异常。我正在使用appcompat 23.1.1。是平台或设备特定的问题,或者我是否犯了任何错误,请帮我找到解决方案。

任何帮助都是适用的。

1 个答案:

答案 0 :(得分:0)

我不认为可以从后台线程显示对话框,假设方法displayInternetAlert在activity / fragment中被调用,你可以像这样直接显示对话框:

private void displayInternetAlert(final Context context) {
    if (!((GlobalActivity) context).isFinishing() && 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();
            }
        }
}