Monali
Monali

Reputation: 1966

How to display AlertDialog inside Timer in Service Class?

I want to show AlertDialog inside Timer in Service class and i am using following code :

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

and I am getting following error:

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)

Thanks in Advance.

Upvotes: 4

Views: 7747

Answers (3)

Lixy
Lixy

Reputation: 213

Best way will be create a class which would inherit from DialogFragment (android.support.v4.app.DialogFragment). See android Doc

You can call the DialogFragment in this way :

 DialogFragment fragment;
 FragmentManager fm = activity.getSupportFragmentManager();
            final FragmentTransaction transaction = fm.beginTransaction();

            fragment.show(transaction, "dialog");
            if (addToBackStack) {
                transaction.addToBackStack(null);
            } else {
                clearBackStack(activity);

Hope it helps

Upvotes: 0

kaushal trivedi
kaushal trivedi

Reputation: 3443

 Attempted to add window with non-application token WindowToken{43f606b0 token=null}.  Aborting.

you are getting this because you are trying to add a window in service which doesnt have a render thread to draw anything.Whenever you are trying to add a dialog it first fetches a token of the parent window form the system which is the the "context" of the dialog.You are passing "this" in the context,which in your case is the service.Which is not proper.

You should try with ApplicationContext or with context of some Activity.

Upvotes: 0

Eric Nordvik
Eric Nordvik

Reputation: 14746

Take a look at this question: Alert dialog from Android service

EDIT:

The problem is that you are trying to pop up a dialog without having any reference to a window. You need to send the message to an Activity and let the Activity handle the dialog pop up.

Using

new AlertDialog.Builder(this);

inside a Service will give you an error similar to the one you got. Using the same code inside an Activity will not.

So one alternative is to send a broadcast to the Activity you are contacting, letting the Activity listen for this broadcast. And when the broadcast is received by the Activity, a Dialog is shown.

Upvotes: 1

Related Questions