简体   繁体   English

运行AsyncTask时出错-上下文?

[英]Error while running AsyncTask - context?

Hello I have some trouble while trying to run an alert in my AsyncTask. 您好,在尝试在AsyncTask中运行警报时遇到一些麻烦。 Whenever something with context is run, the app crashes, like trying to let alert appear. 每当运行带有上下文的内容时,应用程序就会崩溃,就像试图让警报出现一样。

I am following this tutorial: http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/ 我正在遵循此教程: http : //www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/

I am sure, that the error is because of a wrong "context" or something like that. 我敢肯定,该错误是由于错误的“上下文”或类似原因引起的。

I am calling my AsyncTask class from the GCM class like this: 我正在从GCM类中调用我的AsyncTask类,如下所示:

GCM.java: GCM.java:

@Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
    String message = intent.getExtras().getString("price");

//    displayMessage(context, message);
    // notifies user
    generateNotification(context, message);
   runAsync(context);
    // update database
}

// here I want to run my asyncTask
private void runAsync(Context context){
    TestActivity = new TestActivity(context);
    task.execute();
}

TestActivity.java: TestActivity.java:

Context mContext;

public TestActivity(Context context) {
    this.mContext = context;
} 
// Progress Dialog
private ProgressDialog pDialog;

@Override
    protected void onPreExecute() {
        super.onPreExecute();
        productsList = new ArrayList<HashMap<String, String>>();

        pDialog = new ProgressDialog(mContext);
        pDialog.setMessage("Loading products. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
    // here when It shall show the alert it crashes... with the following error
      pDialog.show();

    }

  F/AndroidRuntime(19976): FATAL EXCEPTION: IntentService[GCM-980252920256-1]
  F/AndroidRuntime(19976): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
  F/AndroidRuntime(19976):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:792)
  F/AndroidRuntime(19976):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:265)
  F/AndroidRuntime(19976):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
  F/AndroidRuntime(19976):  at android.app.Dialog.show(Dialog.java:282)
  F/AndroidRuntime(19976):  at com.test.app.TestActivity.onPreExecute(TestActivity.java:72)
  F/AndroidRuntime(19976):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
  F/AndroidRuntime(19976):  at android.os.AsyncTask.execute(AsyncTask.java:534)
  F/AndroidRuntime(19976):  at com.test.app.GCM.asyncTaskRun(GCM.java:63)
  F/AndroidRuntime(19976):  at com.test.app.GCM.onMessage(GCM.java:55)
  F/AndroidRuntime(19976):  at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223)
  F/AndroidRuntime(19976):  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
  F/AndroidRuntime(19976):  at android.os.Handler.dispatchMessage(Handler.java:99)
  F/AndroidRuntime(19976):  at android.os.Looper.loop(Looper.java:176)
  F/AndroidRuntime(19976):  at android.os.HandlerThread.run(HandlerThread.java:60)

Where is my error? 我的错误在哪里?

ProgressDialog needs an Activity as Context (that's a bad design in Android, Context is not always the required Context). ProgressDialog需要一个Activity作为Context(在Android中这是一个糟糕的设计,Context并非始终是必需的Context)。

You should open an Activity that looks like a dialog: 您应该打开一个看起来像对话框的活动:

See Android Activity as a dialog 看到“ Android活动”对话框

Pass context as an Activity not as an ApplicationContext . 将上下文作为Activity而不是作为ApplicationContext传递。 Both classes extends Context class. 这两个类都扩展了Context类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM