Android-приложение вылетает каждый раз, когда я запускаю предыдущее действие - PullRequest
0 голосов
/ 04 июня 2018

У меня есть 2 действия, скажем, активность Альфа и бета-активность.

в моем 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();
        }
    });
}
...

Всякий раз, когда я запускаю это действие, работает как шарм,У меня есть кнопка, на которой я запускаю бета-активность 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 голосов
/ 04 июня 2018

Я не вижу ни одной строки, похожей на 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() это просто хорошая практика

0 голосов
/ 04 июня 2018

На самом деле нет ничего плохого в том, чтобы звонить finish()!на самом деле, если вы слишком много раз ходите туда-сюда без вызова finish(), это может привести к OOM exception, так как стек заполняется экземплярами каждого действия.Я думаю, вам просто нужно вызвать метод finish() после startActivity(), а не раньше.

0 голосов
/ 04 июня 2018

Когда вы храните длинные числа в базе данных Firebase, она, вероятно, сохраняет их в типе данных Float.Поэтому, возможно, чтобы получить значение «телефон», вы должны попробовать

String.valueOf((Float)snapshot.child("phone").getValue());
0 голосов
/ 04 июня 2018

Когда вы запускаете новую активность, ваш код

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

Почему вы заканчиваете свою деятельность при запуске intent, это означает, что когда вы вернулись, он не может найти ваш последний activity, и в этом случаеон не может загрузить ваше последнее действие, потому что оно закончилось до запуска intent.и если вы хотите удалить backstack из действия, тогда используйте

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 

, так что удалите готово и проверьте, что ваш код работает нормально.

Дайте мне знать, работает ли он для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...