我有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
答案 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());