2017-09-17 71 views
1

大家好我推出通知接收时,我试图从服务启动CountDownTimer对话框。我想唤醒屏幕并使用系统警报对话框; 我使用权限:错误从服务启动AlertDialog.Builder

"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)  

,我试图与以luanch它下面的鳕鱼:

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(); 



} 

回答

0

好像您正尝试显示doInBackground()方法AsyncTask的对话框。从onPostExecute()方法中显示。 UI元素只能从UI线程使用,而不能从后台线程使用。

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

还需要Activity背景下创建AlertDialogs:

如果你活套错误试试这个。请参阅答案here以从服务内部创建对话框。

+0

我把这个方法叫做扩展pushe库所创建的服务的类,你可以看到class [here](https://imgur.com/kiqoRQW)的方法 –

+0

你的stacktrace表明方法正在从的AsyncTask。尝试调用在showDialog()之前添加'Looper.prepare();'。和'Looper.loop();'之后。 –

+0

非常感谢你,'Looper'为我工作请求编辑你的主要答案,以帮助其他人有同样的问题, –