【问题标题】:How to display AlertDialog inside Timer in Service Class?如何在服务类的 Timer 中显示 AlertDialog?
【发布时间】:2018-10-05 16:34:10
【问题描述】:

我想在 Service 类的 Timer 中显示 AlertDialog,我正在使用以下代码:

timer.scheduleAtFixedRate( new TimerTask() 
{
    private Handler updateUI = new Handler()
    {
        public void dispatchMessage(android.os.Message msg)
        {
            super.dispatchMessage(msg);
            try {                       
                fun();
            } catch (Exception e) {e.printStackTrace(); }    
        }
    };
    public void run() 
    { 
        try {
            updateUI.sendEmptyMessage(0);                   
        }catch (Exception e) {e.printStackTrace(); }
    }
}, 0,60000);

public void fun()
{
    AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(this);                      
    dlgAlert.setMessage("");
    dlgAlert.setTitle("");              
    dlgAlert.setPositiveButton("OK", null);
    dlgAlert.setCancelable(true);
    dlgAlert.create();
    dlgAlert.show();
}

我收到以下错误:

03-14 13:14:36.879: WARN/WindowManager(60): Attempted to add window with non-application token WindowToken{43f606b0 token=null}.  Aborting.
03-14 13:14:36.879: WARN/System.err(817): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
03-14 13:14:36.889: WARN/System.err(817):     at android.view.ViewRoot.setView(ViewRoot.java:509)
03-14 13:14:36.889: WARN/System.err(817):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
03-14 13:14:36.889: WARN/System.err(817):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
03-14 13:14:36.899: WARN/System.err(817):     at android.app.Dialog.show(Dialog.java:241)
03-14 13:14:36.899: WARN/System.err(817):     at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
03-14 13:14:36.899: WARN/System.err(817):     at com.mobilelocalite.pkg.GPSServiceCellId.comparefromDb(GPSServiceCellId.java:373)
03-14 13:14:36.909: WARN/System.err(817):     at com.mobilelocalite.pkg.GPSServiceCellId$1$1.dispatchMessage(GPSServiceCellId.java:133)
03-14 13:14:36.909: WARN/System.err(817):     at android.os.Looper.loop(Looper.java:123)
03-14 13:14:36.909: WARN/System.err(817):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-14 13:14:36.909: WARN/System.err(817):     at java.lang.reflect.Method.invokeNative(Native Method)
03-14 13:14:36.909: WARN/System.err(817):     at java.lang.reflect.Method.invoke(Method.java:521)
03-14 13:14:36.909: WARN/System.err(817):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-14 13:14:36.920: WARN/System.err(817):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-14 13:14:36.920: WARN/System.err(817):     at dalvik.system.NativeStart.main(Native Method)

提前致谢。

【问题讨论】:

标签: android


【解决方案1】:

看看这个问题:Alert dialog from Android service

编辑:

问题是您试图弹出一个对话框而不引用任何窗口。您需要将消息发送到 Activity 并让 Activity 处理弹出的对话框。

使用

new AlertDialog.Builder(this);

在服务中会给你一个类似于你得到的错误。在 Activity 中使用相同的代码不会。

因此,另一种方法是向您正在联系的 Activity 发送广播,让 Activity 监听此广播。当Activity接收到广播时,会显示一个Dialog。

【讨论】:

  • 你能不能给我一些其他的选择
【解决方案2】:
 Attempted to add window with non-application token WindowToken{43f606b0 token=null}.  Aborting.

你得到这个是因为你试图在服务中添加一个没有渲染线程来绘制任何东西的窗口。每当你试图添加一个对话框时,它首先从系统中获取父窗口的令牌,这是对话框的“上下文”。您在上下文中传递“this”,在您的情况下是服务。这是不正确的。

您应该尝试使用 ApplicationContext 或某些 Activity 的上下文。

【讨论】:

    【解决方案3】:

    最好的方法是创建一个继承自 DialogFragment (android.support.v4.app.DialogFragment) 的类。 See android Doc

    您可以这样拨打DialogFragment

     DialogFragment fragment;
     FragmentManager fm = activity.getSupportFragmentManager();
                final FragmentTransaction transaction = fm.beginTransaction();
    
                fragment.show(transaction, "dialog");
                if (addToBackStack) {
                    transaction.addToBackStack(null);
                } else {
                    clearBackStack(activity);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2012-04-29
      • 2020-03-11
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多