从GCMIntentService调用AsyncTask时,应用程序崩溃

时间:2014-12-16 15:36:02

标签: java android android-asynctask google-cloud-messaging

我正在尝试从GCMBaseIntentService运行AsyncTask,但是当我这样做时应用程序崩溃了。 关键是我想使用MainActivity中的上下文让我的AsyncTask工作(显示ProgressDialog< - 需要上下文)。当我从MainActivity执行相同操作时,它可以工作,但是当我尝试从GCMIntentService调用AsyncTask时,没有显示ProgressDialog - 我该怎么做? 或者还有其他方法可以调用AsyncTask吗?

我希望每次收到消息时都调用AsyncTask(onMessage()) 几个星期我试图解决这个问题,仍然没有提示

以下是我的代码的一部分:

MainActivity.java

   public class MainActivity extends Activity {


    public static Context getAppContext() {
            return MainActivity.mContext;
        }

onCreate(MainActivity.java)

MainActivity.mContext = MainActivity.this;

我的AsyncTask:

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

    Context mContext;


    public AsyncTask(Context mContext) {
        this.mContext = mContext;

    }

GCMIntentService onMessage():

AsyncTask doStuff= new AsyncTask(MainActivity.getAppContext());
        doStuff.execute();

编辑:

当我使用MainActivity.getAppContext()作为GCM中的上下文时

AsyncTask确实运行,做了所有的事情,比如“DatabaseHandler db = new DatabaseHandler(mContext);” 它做了所有db的东西,我也可以在日志中看到,但是有很多警告。  例如,在AsyncTask中,不显示ProgressDialog:

  pDialog = new ProgressDialog(mContext);
            pDialog.setMessage("blablabla");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
          pDialog.show();

当我使用“this”而不是“MainActivity.getAppContext()”

此日志显示:

 AndroidRuntime(3029): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
 AndroidRuntime(3029):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:768)
 AndroidRuntime(3029):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
 AndroidRuntime(3029):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
 AndroidRuntime(3029):  at android.app.Dialog.show(Dialog.java:289)
 AndroidRuntime(3029):  at com.test.app.AsyncTask.onPreExecute(AsyncTask.java:98)
 AndroidRuntime(3029):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
 AndroidRuntime(3029):  at android.os.AsyncTask.execute(AsyncTask.java:535)
 AndroidRuntime(3029):  at com.test.app.GCMIntentService.onMessage(GCMIntentService.java:62)
 AndroidRuntime(3029):  at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223)
 AndroidRuntime(3029):  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
 AndroidRuntime(3029):  at android.os.Handler.dispatchMessage(Handler.java:102)
 AndroidRuntime(3029):  at android.os.Looper.loop(Looper.java:136)
 AndroidRuntime(3029):  at android.os.HandlerThread.run(HandlerThread.java:61)

1 个答案:

答案 0 :(得分:0)

您正在尝试从服务打开对话框,我认为最好的办法是启动透明背景的活动并从那里启动对话框。 您可以从Service

开始活动
相关问题