我有两个班级,MainActivity
和DoHardWork
。 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)
为什么我无法访问上下文?
答案 0 :(得分:1)
发现问题。
它的工作方式是从MainActivity类,我设置一个重复的AlarmManager。当闹钟响起时,GetOperations类充当BroadcastReceiver并被执行。因为我需要在AsyncTask类中进行繁重的工作,所以我在一个名为DoHardWork的类中拥有所有这些工作。 (是的,我知道名字很糟糕,大部分编码都需要改进)但是我不能从BroadcastReceiver调用DoHardWork,我需要从MainActivity调用它。因此,不是试图从BroadcastReceiver中调用它,而是创建一个MainActivity的新实例,并在那里调用一个方法,然后调用DoHardWork。这就是我解决问题的地方。 MainActivity不是静态的,所以当我创建它的新实例时,没有上下文。
我最终做的是将一个上下文从BroadcastReceiver传递给MainActivity。
这可能在解释时非常混乱,但我希望你能得到它的要点。谢谢你的帮助!