我想问为什么我们得到这个注释:
方法调用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
}