无法从上下文访问getContentResolver()?

时间:2012-05-18 16:36:52

标签: java android parameters crash android-context

我有两个班级,MainActivityDoHardWork。 DoHardWork扩展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)

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

1 个答案:

答案 0 :(得分:1)

发现问题。

它的工作方式是从MainActivity类,我设置一个重复的AlarmManager。当闹钟响起时,GetOperations类充当BroadcastReceiver并被执行。因为我需要在AsyncTask类中进行繁重的工作,所以我在一个名为DoHardWork的类中拥有所有这些工作。 (是的,我知道名字很糟糕,大部分编码都需要改进)但是我不能从BroadcastReceiver调用DoHardWork,我需要从MainActivity调用它。因此,不是试图从BroadcastReceiver中调用它,而是创建一个MainActivity的新实例,并在那里调用一个方法,然后调用DoHardWork。这就是我解决问题的地方。 MainActivity不是静态的,所以当我创建它的新实例时,没有上下文。

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

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