java - 尝试获取 firebase 实时数据库值时崩溃

标签 java android

我在尝试从 Firebase 实时数据库获取数据时发生崩溃。 我正在尝试做一些类似强制更新的事情。应用程序启动后,我将检查当前安装的应用程序版本是否等于 firebase 中的值(见下图),如果不等于,我将发送用户到玩市场进行更新。 但应用程序崩溃并显示日志(见下文) 我在 firebase 实时数据库中具有值(value),如下所示:

enter image description here

这是代码:

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/

相关文章:

java - 设置 SurfaceView 的背景图像

android - 修复 arraylist 的适配器构造函数

Android 架构设计 - 如何正确做?

Android SD 卡文件系统

java - 无法为玩家对象赋值?

java - 将 FTP 代理与 apache commons-net 一起使用

java - 将 Java 转换为 Scala

java - 为什么 javac 1.5 与 Eclipse 编译器相比运行速度如此之慢?

c# - 将 C# 系统转换为跨平台应用程序的最佳编程语言?

android - ViewPager - 根据当前页面更改向上按钮图标