每次我开始上一个活动时,Android应用都会崩溃

时间:2018-06-04 12:57:55

标签: java android firebase firebase-realtime-database

我有2个活动让我们说活动Alpha和活动Beta。

在我AlphaActivity.class我的代码如下:

...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_profile);

    cDatabase.addValueEventListener(new ValueEventListener() {
        public static final String TAG = "XD";

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                String u = snapshot.child("username").getValue().toString(),
                        p = snapshot.child("phone").getValue().toString(),
                        ad = snapshot.child("address").getValue().toString(),
                        f = snapshot.child("floor").getValue().toString(),
                        ns = snapshot.child("notes").getValue().toString();
                Address a = new Address(u, p, ad, f, ns);
                infoArray.add(a.address);
                nameArray.add(a.name);
                phoneArray.add(a.phone);
                writeListView();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(ProfileActivity.this, "Action canceled!", Toast.LENGTH_SHORT).show();
        }
    });
}
...

每当我运行时,这种活动都像魅力一样。我在这个按钮中有一个按钮,我就像这样开始Beta活动onClick

public void betaMethod(View view) {
    finish();
    Intent intent = new Intent(this, BetaActivity.class);
    startActivity(intent);
}

BetaActivity.class我做了一些事情然后又有一个按钮onClick如下所示:

public void addToDatabase() {
    ...

    finish();

    Intent intent = new Intent(this, AlphaActivity.class);
    startActivity(intent);
}

当代码执行时,我的应用程序崩溃,我得到的错误位于我AlphaActivity.class所在的p = snapshot.child("phone").getValue().toString()。我敢打赌它与firebase方法onDataChange有关但我无法弄明白。有什么建议吗?

我得到的错误是:

06-04 16:59:16.885 13978-13978/com.example.johng.assosfood E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.johng.assosfood, PID: 13978
java.lang.NullPointerException
    at com.example.johng.assosfood.ProfileActivity$1.onDataChange(ProfileActivity.java:48)
    at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source)
    at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source)
    at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5333)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
    at dalvik.system.NativeStart.main(Native Method)

其中ProfileActivity.java = AlphaActivity.java

4 个答案:

答案 0 :(得分:1)

当您开始新的活动时,您的代码是

public void betaMethod(View view) {
    finish(); //here
    Intent intent = new Intent(this, BetaActivity.class);
    startActivity(intent);
}

为什么在启动intent时完成您的活动,这意味着当您回来时无法找到您的上一个activity,在这种情况下,它无法加载您的上一个活动,因为它在启动之前已完成{{ 1}}。如果您想从活动中删除intent,请使用

backstack

所以从这里删除完成并检查您的代码是否正常。

让我知道它是否适合你。

答案 1 :(得分:1)

我没有看到任何一行看起来像cDatabase = FireabseDatabase.getInstance().getReference();

  

电话儿童必须包含数字值,并且您将其作为字符串

进行检索

而不是p = snapshot.child("phone").getValue().toString()

始终使用p = snapshot.child("phone").getValue(String.class);

p = String.valueOf(snapshot.child("phone").getValue(String.class));为所有快照执行此操作。

同样在public void betaMethod(View view)中使用finish();在startActivity()之后,这只是一种很好的做法

答案 2 :(得分:0)

实际上调用finish()没有错!事实上,如果你在没有调用finish()的情况下来回走动太多次,这会导致OOM exception,因为堆栈会填满每个活动的实例。我认为您只需要在finish()之前调用startActivity()方法。

答案 3 :(得分:0)

在Firebase数据库中存储长号时,它可能会将其存储在Float数据类型中。所以也许要获得“手机”的价值你应该尝试

String.valueOf((Float)snapshot.child("phone").getValue());