使用AsyncTask在后台服务中添加android进度对话框,得到致命exception

  1. Iam从预定服务中调用Asynctask每10分钟运行一次。

  2. 运行服务时, 进度对话框OnpreExecute获取exception。

错误

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) 

编辑1: 报警pipe理器每5分钟拨打一次服务

 /*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); } 

从Service Onstart调用AsyncTask

  @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类onStart方法

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

帮我解决这个问题。

  • 我怎样才能使ProgressDialog被后退button取消,而不是屏幕的水龙头?
  • 为什么ProgressDialog的背景没有设置为透明?
  • 如何将自定义微调器图像应用于android中的进度对话框
  • ProgressDialog中的“不确定”是什么意思?
  • Android的AsynTask与进度对话框取消
  • 我想要一个进度条,但得到一个微调进度对话框
  • 解除进度对话框
  • Android AsynTask取消进度对话框
  • 其实你不能从一个服务启动一个进度对话框,因为它需要的活动上下文而不是应用程序上下文在你的情况下是空的。

    更多的信息在这里: link1 , link2和link3

    如果你想触发基于服务行为的进度对话框,你可以使用观察者devise模式,看这里 。

    更新:如果您的应用程序正在运行,您可以使用处理程序并运行它每5分钟。

    这是一个完整的例子:

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

    初始化您的ProgressDialog

    OnPreExecute();

     runOnUiThread(new Runnable() { @Override public void run() { if (pDialog == null) { pDialog = new ProgressDialog(appContext); pDialog.setCanceledOnTouchOutside(false); pDialog.setCancelable(false); pDialog.setMessage("Please Wait Updating Data From..."); } pDialog.show(); } }); 

    OnPostExecute();

      pDialog.dismiss(); 

    exceptionException:android.vi‌​ew.WindowManager$BadT‌​okenException: Unable to add window -- token null is not for an application在上下文不活动时。 这个例外可能有其他原因,但背景是主要原因。 而且,如果先前显示的对话框没有被解除,则可能发生exception。

    请试试这个代码:

     runOnUiThread(new Runnable() { @Override public void run() { if(appContext != null) { // if dialog is already showing, hide it if(pDialog != null && pDialog.isShowing()) { pDialog.dismiss(); } if (pDialog == null) { pDialog = new ProgressDialog(appContext); pDialog.setCanceledOnTouchOutside(false); pDialog.setCancelable(false); pDialog.setMessage("Please Wait Updating Data From..."); } pDialog.show(); } else { Log.e("Error","Context is Null"); } } }); 

    可以添加一个额外的检查: http : //dimitar.me/android-displaying-dialogs-from-background-threads/

    您不需要在onPreExecute的线程中初始化对话框。 因为这个方法总是在UI线程中调用。 通过调用一个线程,你正在拖延它。 所以doInbackground可能发生在创build对话框之前。

    你也不应该在doItBackground方法中调用任何修改UI的东西。 因为这个方法在一个工作线程中运行。 任何UI调用都必须在主线程中。 onPostExecute由主线程调用。 所以把你的对话相关的调用,但不是在doInBackground。

    doInbackground中的这些行需要被删除。

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

    1)您不需要在Runnable设置ProgressDialogonPreExecute()onPostExecute()任何内容都已经在UI线程上运行。 只有doInBackground()运行UI线程。

    2)在MainActivity放置AsyncTask类,从MainActivity调用它,而不是从你的Service 。 像这样从MainActivity调用你的AsyncTask

     new MyAsyncTask(MainActivity.this).execute(""); 

    3)最后,把这个构造函数放在你的AsyncTask类中:

     public MyAsyncTask(Context context) { appContext = context; } 

    看起来你的上下文没有合适的资源。 确保你正在使用正确的上下文。

     Context context = this; ProgressDialog progressDialog = new ProgressDialog(context); progressDialog.show(); 

    其中“this” – AppCompatActivity或Activity上下文