【问题标题】:Can't access getContentResolver() from context?无法从上下文访问 getContentResolver()?
【发布时间】:2012-05-18 16:36:52
【问题描述】:

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

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

【问题讨论】:

  • 我认为 e.printStackTrace 不会打印到日志中。然而,鲜为人知的事实是,您可以将异常作为参数传递给日志语句。试试 Log.e("apptag", "Crashed!", e);看看你是否得到了一些更有用的输出。
  • 它确实打印到了日志中。如果我将它作为参数传递给 Log.e(),我会得到相同的异常。如果有帮助,我会用整个例外情况更新第一篇文章。
  • 不要存储作为参数传递的Context,而是尝试在其上调用getApplicationContext()
  • 您发布的代码是“returnResults”方法还是“getTextMessages”方法?
  • @K-ballo,一旦我尝试在 ccc 上调用 getApplicationContext,它就会崩溃。

标签: java android parameters crash android-context


【解决方案1】:

找到问题了。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多