-1

我有两个班,MainActivityDoHardWork。DoHardWork extends AsyncTask,并且在类中我需要访问上下文才能获取contentResolver并执行查询。

没问题,对吧?让我们将它作为参数传递给DoHardWork

    Context currCont = this;
    new DoHardWork(currCont).execute();

然后在构造函数中,我获取上下文并将其存储在一个名为ccc.

但是,一旦我尝试访问上下文,它就会崩溃,没有任何有意义的错误。

try {
    Cursor cursor = ccc.getContentResolver().query(
            Uri.parse("content://sms/inbox"), null, null, null, null);
}
catch (Exception e) {
    Log.e("apptag", e.getMessage());
    e.printStackTrace();
}

我得到的是:

05-18 18:54:06.725: E/apptag(29063): Crashed
05-18 18:54:06.725: E/apptag(29063): java.lang.NullPointerException
05-18 18:54:06.725: E/apptag(29063):    at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:91)
05-18 18:54:06.725: E/apptag(29063):    at se.jbhalmstad.ndroid.DoHardWork.getTextMessages(DoHardWork.java:214)
05-18 18:54:06.725: E/apptag(29063):    at se.jbhalmstad.ndroid.DoHardWork.returnResults(DoHardWork.java:114)
05-18 18:54:06.725: E/apptag(29063):    at se.jbhalmstad.ndroid.DoHardWork.doInBackground(DoHardWork.java:55)
05-18 18:54:06.725: E/apptag(29063):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-18 18:54:06.725: E/apptag(29063):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-18 18:54:06.725: E/apptag(29063):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-18 18:54:06.725: E/apptag(29063):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-18 18:54:06.725: E/apptag(29063):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-18 18:54:06.725: E/apptag(29063):    at java.lang.Thread.run(Thread.java:856)

为什么我无法访问上下文?

4

1 回答 1

1

发现了问题。

它的工作方式是从 MainActivity 类中,我设置了一个重复的 AlarmManager。当警报响起时,GetOperations 类充当 BroadcastReceiver 并被执行。因为我需要 AsyncTask 类中的繁重工作,所以我在一个名为 DoHardWork 的类中完成了所有这些工作。(是的,我知道名字不好,而且大多数编码都需要改进)但是我不能从 BroadcastReceiver 调用 DoHardWork,我需要从 MainActivity 调用它。因此,我没有尝试从 BroadcastReceiver 调用它,而是创建了一个新的 MainActivity 实例并在其中调用一个方法,然后调用 DoHardWork。这就是我提出问题的地方。MainActivity 不是静态的,所以当我创建它的新实例时,没有上下文。

我最终做的是将上下文从 BroadcastReceiver 传递给 MainActivity。

这可能在解释时变得非常混乱,但我希望你能明白它的要点。谢谢大家的帮助!

于 2012-05-19T00:18:53.753 回答