我想问为什么我们得到这个注释:
方法调用getContext.getContentResolver()可能会产生 的NullPointerException
为什么它存在而不存在于程序碎片/活动的其他部分?这种方法已经在Google制作的教程中使用 - 这里是ContentProvider代码https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android/sunshine/app/data/WeatherProvider.java的链接,即使您只使用空白活动创建一个应用程序,并将该方法放在新创建的ContentProvider中。
我们是否应该在ContentProvider之外使用getContext().getContentResolver().notifyChange(uri, null);
获取uri,然后在更新/插入/删除完成后使用notifyChange?或者我们可以以某种方式解决它?
答案 0 :(得分:9)
如果您查看ContentProvider的源代码(只需按住SHIFT并单击Android Studio中的类名),您就会发现该实现持有一个Context类型的对象作为mContext。
您的解决方案是一样的,这意味着如果ContentProvider的mContext为null,您的引用也将为null。所以没有必要这样做。
为了帮助您,这只是您的IDE的警告,如果您自己制作这样的构造。但在这种情况下,总会有上下文,因为ContentProvider是由您的系统生成的。要避免IDE中的错误,只需在类定义上方写上 @SuppressWarnings(“ConstantConditions”),如:
...
@SuppressWarnings("ConstantConditions")
public class NoteProvider extends ContentProvider {
...
答案 1 :(得分:7)
如果您可以确保 getContext()永远不能 null ,那么您可以忽略此警告。我认为警告甚至会消失,你只需检查null:
if (getContext() != null) {
getContext().getContentResolver();
}
如果 getContext() null ,您必须记住要执行的代码。
干杯
编辑: 小心@Shivani Gupta给你的答案,因为你可以得到不同的背景。请参阅:Difference between getContext() , getApplicationContext() , getBaseContext() and "this"
答案 2 :(得分:2)
写getApplicationContext().getContentResolver()
希望这会奏效。
答案 3 :(得分:0)
每当您尝试使用对象的成员或方法时,如果您尝试使用其成员/方法的对象为null,则可能会出现运行时异常。假设您想要使用对象的成员/方法obj
。如果您这样使用它:
if (obj != null) {
//use members/methods of obj
}
然后你阻止了这个问题。但是,您可能希望将其作为例外处理,如下所示:
try {
//use members/methods of obj
} catch (NullPointerException npe) {
//handle the NullPointerException
}
答案 4 :(得分:0)
好吧,似乎我通过在课程开始时声明上下文来自行修复。
public class NoteProvider extends ContentProvider {
Context context;
然后在 onCreate()
中初始化它@Override
public boolean onCreate() {
mSQLiteOpenHelper = new NoteDbHelper(getContext());
context = getContext();
return true;
}
我认为当我使用 context.getContentResolver()。notifyChange(uri,null); 或 retCursor.setNotificationUri(context.getContentResolver()时,确保我始终拥有Context。 uri); 在insert / update / delete / query方法中 - 通过提到的方法返回游标的retCursor。
我已经在我的手机上运行了应用程序并且还没有问题,如果我愿意,可能会对此帖进行编辑。
修改强>
毕竟它没有什么区别 - @Mate的回答解释,谢谢你我认为我现在得到它:]
答案 5 :(得分:0)
根据ContentProvider getContext()
docs:
检索此提供程序正在运行的Context。仅在调用onCreate()时可用 - 这将在构造函数中返回null。
因此getContext()
方法不会在null
,insert()
或update()
中返回delete()
,因为在这些调用之前会调用onCreate()
因此,如果在这种情况下使用该行,则可以禁用该行的警告...
//noinspection ConstantConditions
getContext().getContentResolver().notifyChange(uri, null);
答案 6 :(得分:0)
当您在Fragment或DialogFragment中调用getActivity()
或getContext()
以使用诸如getContentResolver()
之类的父活动方法之一时,通常会发生这种情况,因为编译器不确定这些方法是否会返回空值。
要解决此问题,请不要使用getActivity()
或getContext()
;您可以分别简单地分别使用requireActivity()
和requireContext()
;这些方法可确保返回非null值。
您可以查看答案here