我在尝试从 Firebase 实时数据库获取数据时发生崩溃。 我正在尝试做一些类似强制更新的事情。应用程序启动后,我将检查当前安装的应用程序版本是否等于 firebase 中的值(见下图),如果不等于,我将发送用户到玩市场进行更新。 但应用程序崩溃并显示日志(见下文) 我在 firebase 实时数据库中具有值(value),如下所示:
这是代码:
public class AppUpdater {
private Activity mActivity;
private String userCurrentVersion = null;
private String currentVersion = null;
private FirebaseDatabase mDB = FirebaseDatabase.getInstance();
private DatabaseReference appData = mDB.getReference("AppData");
public AppUpdater(Activity mActivity) {
this.mActivity = mActivity;
}
public boolean hasNewVersion() {
getCurrentVersion();
if (currentVersion.equals(userCurrentVersion())) {
return true;
} else {
return false;
}
}
private String userCurrentVersion() {
try {
PackageInfo pInfo = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), 0);
userCurrentVersion = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return userCurrentVersion;
}
private void getCurrentVersion() {
getVersionFromFireBase(appData, new OnDataRetrieveListener() {
@Override
public void onSuccess(DataSnapshot dataSnapshot) {
Log.d("getCurrentVersion", "onSuccess: ");
currentVersion = dataSnapshot.child("AppVersion").getValue(String.class);
}
@Override
public void onStart() {
Log.d("getCurrentVersion", "onStart: ");
}
@Override
public void onFailure() {
Log.d("getCurrentVersion", "onFailure: ");
}
});
}
private void getVersionFromFireBase(DatabaseReference appData, final OnDataRetrieveListener listener) {
listener.onStart();
appData.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
dataSnapshot.child("AppVersion").getValue();
listener.onSuccess(dataSnapshot);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
listener.onFailure();
}
});
}
}
在 Activity 的 onCreate 方法中,我调用了方法:
private void checkForUpdate() {
mUpdater = new AppUpdater(this);
isUpdateRequired = mUpdater.hasNewVersion();
Log.d("isUpdateRequired", "checkForUpdate: "+isUpdateRequired);
if (isUpdateRequired) {
//TODO open google play market to update
}
}
应用程序崩溃并显示日志:
Process: com.enjoyapps.easywedd, PID: 17268
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.enjoyapps.easywedd/com.enjoyapps.easywedd.ui.activities.LoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3086)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3229)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6981)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.enjoyapps.easywedd.AppUtils.AppUpdater.hasNewVersion(AppUpdater.java:32)
at com.enjoyapps.easywedd.ui.activities.LoginActivity.checkForUpdate(LoginActivity.java:28)
at com.enjoyapps.easywedd.ui.activities.LoginActivity.onCreate(LoginActivity.java:23)
at android.app.Activity.performCreate(Activity.java:7326)
at android.app.Activity.performCreate(Activity.java:7317)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
最佳答案
您在此方法中收到 NullPointerException:
public boolean hasNewVersion() {
getCurrentVersion();
if (currentVersion.equals(userCurrentVersion())) {
return true;
} else {
return false;
}
}
在此代码中,您使用的是 currentVersion.equals,这里您将 gettign nullpointerException,因为您使用的是对象 currentVersion,该对象在代码中初始化了一个 null 值,如下所示:
private String currentVersion = null;
获取变量中的 currentVersion,然后使用 .equals()
执行检查。
关于java - 尝试获取 firebase 实时数据库值时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60362775/