Android: getContext(). getcontentresolver()有时会得到NullPointerE



我想问为什么我们得到这个注释:

方法调用getContext.getContentResolver()可能产生NullPointerException

为什么它在那里,而不是在程序片段/活动的其他部分?这种方法已经在谷歌制作的教程中使用-这里是ContentProvider代码的链接https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android/sunshine/app/data/WeatherProvider.java即使你创建一个应用程序,只有一个空白的活动,并把那个方法在一个新创建的ContentProvider它在那里。

我们是否应该使用getContext().getContentResolver().notifyChange(uri, null);外部ContentProvider获得传递的uri,然后在更新/插入/删除完成notifyChange?或者我们可以想办法解决?

如果你查看ContentProvider的源(只需按住SHIFT并单击Android Studio中的类名),那么你会发现实现是持有类型为mContext的Context对象。

你的解决方案是一样的,这意味着如果ContentProvider的mContext为空,你的引用也将为空。所以没有这个必要。

为了帮助您,如果您自己创建这样的构造,这只是IDE的警告。但在这种情况下,总是会有上下文,因为ContentProvider是由你的系统生成的。为了避免IDE中的错误,只需在类定义上方编写@SuppressWarnings("ConstantConditions"),如:

...
@SuppressWarnings("ConstantConditions")
public class NoteProvider extends ContentProvider {
...

如果您可以确保getContext()永远不会为null,那么您可以简单地忽略此警告。我认为警告甚至消失,你只要检查null:

if (getContext() != null) {
    getContext().getContentResolver();
}

你只需要记住,如果getContext()null,代码将不会被执行。

欢呼

编辑:要小心@Shivani Gupta给你的答案,因为你可能会得到不同的背景。参见:getContext(), getApplicationContext(), getBaseContext()和"this"

的区别

getApplicationContext().getContentResolver()

好吧,我似乎通过在类的开头声明Context来修复它。

public class NoteProvider extends ContentProvider {
    Context context;
然后在onCreate() 中初始化它
@Override
    public boolean onCreate() {
        mSQLiteOpenHelper = new NoteDbHelper(getContext());
        context = getContext();
        return true;
    }

我认为这确保了我总是有上下文当我使用 Context . getcontentresolver()。retCursor. setnotificationuri (context.getContentResolver(), uri);在插入/更新/删除/查询方法中- retCursor被上述方法返回游标

我已经在手机上运行了这个应用程序,还没有遇到问题,如果我要这样做,可能会有一个编辑这篇文章。

编辑:

这毕竟没有什么区别- @Mate的解释,谢谢你的回答,我想我现在明白了:]

根据ContentProvider getContext() docs:

检索此提供程序正在其中运行的上下文。只有在onCreate()被调用时才可用——这将在构造函数中返回null。

所以getContext()方法不会在insert(), update()delete()中返回null,因为onCreate()将在这些调用之前被调用。

所以如果你在这种情况下使用它,可以禁用该行的警告。

//noinspection ConstantConditions
getContext().getContentResolver().notifyChange(uri, null);

当您尝试使用对象的成员或方法时,如果您尝试使用的对象的成员/方法为空,则可能会出现运行时异常。假设您想使用对象obj的成员/方法。如果你像这样使用它:

if (obj != null) {
    //use members/methods of obj
}

那么你就避免了这个问题。但是,您可能希望将其作为异常处理,像这样:

try {
    //use members/methods of obj
} catch (NullPointerException npe) {
    //handle the NullPointerException
}

相关内容

最新更新