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

我有两个类,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)

为什么我不能访问上下文?

参考方案

找到了问题。

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

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

在解释时,这可能会变得很混乱,但我希望您能理解。谢谢您的帮助!

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

如何在过滤器()java8中使用peek()? - java

我有一个LinkedHashMap。sorted:{0=[1, 2], 5=[4, 3], 1=[2, 0, 3], 2=[4, 0, 1], 3=[4, 5, 1], 4=[5, 2, 3]} 我尝试根据其大小过滤每个键的值。例如对于条目2=[4, 0, 1],我需要过滤值,以便键只能具有其大小大于或等于(>=)的值。考虑2=[4, 1]:由于0只有…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…