Mam 2 działania, powiedzmy aktywność alfa i aktywność beta.

W moim AlphaActivity.class Mam poniższy kod:

...
@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();
        }
    });
}
...

Ilekroć prowadzę tę czynność, działa jak urok. Mam przycisk w tym, w którym rozpoczynam aktywność beta onClick jak:

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

W BetaActivity.class Robię coś, a następnie ponownie mam przycisk, gdzie onClick działa poniżej:

public void addToDatabase() {
    ...

    finish();

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

Gdy kody wykonuje, moja aplikacja zawiesza się i otrzymuję błąd, jest tam na AlphaActivity.class tam, gdzie mam p = snapshot.child("phone").getValue().toString(). Założę się, że ma to związek z metodą FireBase onDataChange, ale nie mogę tego zrozumieć. Proszę o wszelkie sugestie?

Błąd, który otrzymuję:

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)

Gdzie profileActivity.java = alfaaktywność.java

-1
John Gkouziotis 4 czerwiec 2018, 15:57

4 odpowiedzi

Najlepsza odpowiedź

Nie widzę żadnej linii wyglądającej jak cDatabase = FireabseDatabase.getInstance().getReference();

Dziecko telefoniczne musi zawierać wartość w liczbach i pobierasz go jako ciąg

Zamiast p = snapshot.child("phone").getValue().toString().

Zawsze używaj p = snapshot.child("phone").getValue(String.class); lub

p = String.valueOf(snapshot.child("phone").getValue(String.class)); Zrób to dla wszystkich migawek.

Także w public void betaMethod(View view) użyj wykończenia (); Po startActivity() To tylko dobra praktyka

1
parag pawar 4 czerwiec 2018, 13:13

Po rozpoczęciu nowej aktywności kod jest

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

Dlaczego kończysz swoją aktywność podczas uruchamiania intent oznacza, że kiedy wróciłeś, nie może znaleźć ostatniego activity iw takim przypadku nie można załadować ostatniej aktywności, ponieważ zakończyło się przed uruchomieniem intent . a jeśli chcesz usunąć backstack z aktywności, a następnie użyj

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

Usuń wykończenie stąd i sprawdź, czy kod działa dobrze.

Daj mi znać, jeśli to działa dla Ciebie.

1
Sandeep Parish 4 czerwiec 2018, 13:02

Właściwie nie ma nic złego w dzwończym {x0}}! W rzeczywistości, jeśli wrócisz zbyt wiele razy bez wywołania finish() Może to spowodować, że stos wypełnia się instancjami każdego aktywności. Myślę, że po prostu musisz zadzwonić do metody finish() po startActivity() nie wcześniej.

0
user 007 4 czerwiec 2018, 13:09

Podczas przechowywania długich numerów w bazie danych FireBase prawdopodobnie przechowuje go w typie danych pływakowych. Więc może uzyskać wartość "telefonu", powinieneś spróbować

String.valueOf((Float)snapshot.child("phone").getValue());
0
SafalFrom2050 4 czerwiec 2018, 13:12