【问题标题】:error Launch AlertDialog.Builder from Service错误从服务启动 AlertDialog.Builder
【发布时间】:2017-09-17 13:22:44
【问题描述】:

大家好,我正在尝试在收到推送通知时从 Service 启动 CountDownTimer 对话框。我想要唤醒屏幕并使用系统警报对话框; 我使用权限:

“android.permission.SYSTEM_ALERT_WINDOW”、“android.permission.WAKE_LOCK”

但是当收到通知时,得到以下错误和服务carash:

                                                                    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
                                                                       at android.os.Handler.<init>(Handler.java:200)

                                                                       at android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.java:46)
                                                                       at android.support.v7.app.AlertDialog.<init>(AlertDialog.java:97)
                                                                       at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:929)
                                                                       at com.iransnaptaxi.taxi.Server.PusheServic.ShowDialog(PusheServic.java:91)
                                                                       at com.iransnaptaxi.taxi.Server.PusheServic.onMessageReceived(PusheServic.java:48)

                                                                       at android.os.AsyncTask$2.call(AsyncTask.java:297)
                                                                       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 

我试着用下面的鳕鱼来吃它:

private void ShowDialog(){

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK| PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE, "taxiWakeLock");
    wakeLock.acquire();



    final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getApplicationContext(), R.style.AppTheme_MaterialDialogTheme);

     dialogBuilder.setTitle("درخواست سفر")
            .setMessage("درخواست سفر دارید").setNegativeButton("لغو", null)
            .setPositiveButton("مشاهد سفر", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {



                }
            });

    final AlertDialog dialog = dialogBuilder.create();
    final Window dialogWindow = dialog.getWindow();
    final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();


    dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    dialogWindowAttributes.windowAnimations = R.anim.dialogue_scale_anim_open;
    dialog.show();
    new CountDownTimer(15000, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            dialog.setMessage("زمان مانده تا لغو درخواست"+"00:"+ (millisUntilFinished/1000));
        }

        @Override
        public void onFinish() {
            dialog.dismiss();
            //info.setVisibility(View.GONE);
        }
    }.start();



}

【问题讨论】:

    标签: android


    【解决方案1】:

    似乎您正试图从AsyncTaskdoInBackground() 方法显示对话框。从onPostExecute() 方法显示它。 UI 元素只能在 UI 线程中使用,而不能在后台线程中使用。

    如果遇到 Looper 错误,试试这个:

    Looper.prepare();
    showDialog();
    Looper.loop();
    

    您还需要Activity 上下文来创建AlertDialogs。请参阅答案here 从服务内部创建对话框。

    【讨论】:

    • 我从扩展 pushe 库创建的服务的类中调用此方法,您可以看到类 here 的方法
    • 您的堆栈跟踪表明该方法是从 AsyncTask 调用的。尝试在 showDialog() 之前调用添加 Looper.prepare();;和Looper.loop(); 之后。
    • 非常感谢,'Looper' 为我工作,请编辑您的主要答案以帮助其他有同样问题的人,
    • 再次您好,这在Android 5 上很好用,但在Android 6 及更高版本上不起作用,尽管在设置中启用了TYPE_SYSTEM_OVERLAY 访问权限。你能帮帮我吗?
    • 检查这个问题和它的答案。 stackoverflow.com/questions/40337131/…
    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2019-02-26
    • 2017-06-14
    相关资源
    最近更新 更多