Search code examples
androidserviceandroid-asynctaskprogressdialogandroid-pendingintent

Adding android progress dialog inside Background service with AsyncTask,Getting FATAL Exception


  1. Iam calling a Asynctask from Scheduled Service Every 10 mins it will Run.

  2. while running the Service, Progress dialog getting Exception from OnpreExecute.

ERROR :

FATAL EXCEPTION: main                                                                                    
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.view.ViewRootImpl.setView(ViewRootImpl.java:594)

at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)

at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)

at android.app.Dialog.show(Dialog.java:286)

EDIT 1: Alarm Manager for calling the service for every 5 mins

/*Alarm manager Service for From Server*/
private void setServerFetch() {
    // for  to Server to GPS PING
    Intent myIntent1 = new Intent(LoginPage.this, AlarmService.class);
    pendingintent1 = PendingIntent.getService(LoginPage.this, 1111, myIntent1, 0);
    AlarmManager alarmManager5 = (AlarmManager) getSystemService(ALARM_SERVICE);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTimeInMillis(System.currentTimeMillis());
    calendar1.add(Calendar.SECOND, 1);
    alarmManager5.set(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), pendingintent1);
    alarmManager5.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), 300 * 1000, pendingintent1);

}

Calling the AsyncTask from Service Onstart

 @Override
    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);


        try
        {

                Asynctask_Incident task=new Asynctask_Incident();
                task=new();

        }
        catch (Exception e)
        {
            e.printStackTrace();
            Log.i("PING", "EXCEPTION in reading Data from Web Async task ONstart.!");

        }

    }

Asynctask Class onStart Method

public class Asynctask_Incident extends AsyncTask<String, Void, Void>
    {


        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();

            runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    if (!pDialog.isShowing())
                    {
                        pDialog = new ProgressDialog(appContext);
                        pDialog.setCanceledOnTouchOutside(false);
                        pDialog.setCancelable(false);
                        pDialog.setMessage("Please Wait Updating Data From...");
                        pDialog.show();
                    }
                }
            });


        }

        @Override
        protected Void doInBackground(String... params)
        {
            try {
                getAPICall();

            } catch (Exception e) {
                e.printStackTrace();

                if (pDialog.isShowing()) {
                    pDialog.dismiss();
                }

            }

            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid)
        {

            super.onPostExecute(aVoid);

            if (pDialog.isShowing()) {
                pDialog.dismiss();
            }


        }


    }

Help me to Solve this Issue.


Solution

  • Actually you can't start a progress dialog from a service, because it needs the activity context not application context which come to be null in your case.

    More info here: link1 , link2 and link3

    If you want to trigger progress dialog based on service action, you may use Observer design patter, look here.

    Update: If your app is running, you can use Handler and run it each 5 minutes.

    Here is a complete example:

    public class TestActivity extends AppCompatActivity {
    
    private Handler handler;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    
        handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //
                new Asynctask_Incident(TestActivity.this).execute("url");
                handler.postDelayed(this, 5 * DateUtils.MINUTE_IN_MILLIS);
            }
        }, 0);
    }
    
    public class Asynctask_Incident extends AsyncTask<String, Void, Void> {
    
    
        ProgressDialog pDialog;
        Context appContext;
    
        public Asynctask_Incident(Context ctx) {
            appContext = ctx;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
    
                pDialog = new ProgressDialog(appContext);
                pDialog.setCanceledOnTouchOutside(false);
                pDialog.setCancelable(false);
                pDialog.setMessage("Please Wait Updating Data From...");
                pDialog.show();
    
    
        }
    
        @Override
        protected Void doInBackground(String... params) {
            try {
                getAPICall();
    
            } catch (Exception e) {
                e.printStackTrace();
    
                if (pDialog.isShowing()) {
                    pDialog.dismiss();
                }
    
            }
    
            return null;
        }
    
        private void getAPICall() {
    
            //5 seconds delay for test, you can put your code here
            try {
                Thread.sleep(5 * DateUtils.SECOND_IN_MILLIS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void onPostExecute(Void aVoid) {
    
            super.onPostExecute(aVoid);
    
            if (pDialog.isShowing()) {
                pDialog.dismiss();
            }
    
    
        }
    
    
    }
    
    }