Autore Topic: Perdita dell'extra di un Intent  (Letto 587 volte)

Offline AL_94

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 8.1; Mac OS X 10.9
Perdita dell'extra di un Intent
« il: 15 Agosto 2013, 16:45:37 CEST »
0
Salve a tutti, dopo una breve ricerca nel forum, credo di essere sicuro (almeno spero  :-P) che questo argomento non sia mai stato trattato, quindi apro il topic  :-).

La mia applicazione è formata da 3 activity, la pagina principale (A) -> la pagina dei dati (B) -> la pagina di un singolo dato (C)
Il problema adesso è molto semplice: Dall'activity A passo una stringa attraverso l'intent che verrà poi recuperata e utilizzata nell'activity B. Ovviamente può accadere che l'activity B richiami la C, e il problema nasce qua; quando premo il bottone "Indietro" di Android (non quello fisico del dispositivo) mentre sono nell'activity C, la B va in errore poiché non trova più il riferimento all'intent. Come posso fare affinché la stringa che passo dalla A alla B non venga persa?

Le istruzioni che uso per recuperare l'intent nella activity B sono:
Codice (Java): [Seleziona]
Intent intent = getIntent();
String query = intent.getStringExtra(HomePage.KEY_QUERY_DB);

Grazie

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Perdita dell'extra di un Intent
« Risposta #1 il: 15 Agosto 2013, 16:52:01 CEST »
0
Se posti il LogCat probabilmente troverai che intent è null, da cui l'errore nella riga successiva.

Anche se non è quello l'errore, in generale è sempre buona regola di programmazione controllare che quello-che-può-essere-null non sia null prima di usarlo.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AL_94

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 8.1; Mac OS X 10.9
Re:Perdita dell'extra di un Intent
« Risposta #2 il: 15 Agosto 2013, 17:04:31 CEST »
0
Questo è il LogCat che mi da quando premo il button Indietro:

Codice: [Seleziona]
08-15 15:02:33.487: W/dalvikvm(770): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
08-15 15:02:33.557: E/AndroidRuntime(770): FATAL EXCEPTION: main
08-15 15:02:33.557: E/AndroidRuntime(770): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.DatabasePage}: java.lang.NullPointerException
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.os.Handler.dispatchMessage(Handler.java:99)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.os.Looper.loop(Looper.java:137)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.ActivityThread.main(ActivityThread.java:5041)
08-15 15:02:33.557: E/AndroidRuntime(770):         at java.lang.reflect.Method.invokeNative(Native Method)
08-15 15:02:33.557: E/AndroidRuntime(770):         at java.lang.reflect.Method.invoke(Method.java:511)
08-15 15:02:33.557: E/AndroidRuntime(770):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-15 15:02:33.557: E/AndroidRuntime(770):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-15 15:02:33.557: E/AndroidRuntime(770):         at dalvik.system.NativeStart.main(Native Method)
08-15 15:02:33.557: E/AndroidRuntime(770): Caused by: java.lang.NullPointerException
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:43)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
08-15 15:02:33.557: E/AndroidRuntime(770):         at com.example.app.DataBaseHelper.query(DataBaseHelper.java:125)
08-15 15:02:33.557: E/AndroidRuntime(770):         at com.example.app.DatabasePage.onCreate(DatabasePage.java:38)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.Activity.performCreate(Activity.java:5104)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-15 15:02:33.557: E/AndroidRuntime(770):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
08-15 15:02:33.557: E/AndroidRuntime(770):         ... 11 more

Conosci qualche metodo per poterlo risolvere?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Perdita dell'extra di un Intent
« Risposta #3 il: 15 Agosto 2013, 17:52:49 CEST »
0
Prima cosa identificare la causa dell'errore, e in questo ti aiuta il LogCat:

Citazione
08-15 15:02:33.557: E/AndroidRuntime(770): Caused by: java.lang.NullPointerException
08-15 15:02:33.557: E/AndroidRuntime(770):         at com.example.app.DataBaseHelper.query(DataBaseHelper.java:125)
08-15 15:02:33.557: E/AndroidRuntime(770):         at com.example.app.DatabasePage.onCreate(DatabasePage.java:38)

Qualcosa è null e non dovrebbe esserlo (NullPointerException), alla riga 38 di DatabasePage.java, dove presumibilmente richiama una funzione alla riga 125 di DataBaseHelper.java.

Cosa hai in quelle righe?


NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AL_94

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 8.1; Mac OS X 10.9
Re:Perdita dell'extra di un Intent
« Risposta #4 il: 15 Agosto 2013, 18:19:27 CEST »
0
Questa è la funzione:
Codice (Java): [Seleziona]
public Cursor query(String query) {
                Cursor c = database.rawQuery(query, null);
                return c;
        }

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Perdita dell'extra di un Intent
« Risposta #5 il: 15 Agosto 2013, 19:09:25 CEST »
+1
Una prima cosa che puoi fare, giusto per evitare il crash è gestire il caso in cui l'activity viene aperta senza l'extra.

Codice (Java): [Seleziona]
Intent intent = getIntent();
String query;

query = intent.getStringExtra(HomePage.KEY_QUERY_DB);

if (query==null) query = ...   // metti una key_query di default o fai in modo che se è null non esegua la query


A questo punto e per rispondere alla tua domanda iniziale:

Citazione
Come posso fare affinché la stringa che passo dalla A alla B non venga persa?

Puoi sarlvare il contenuto di query in una sharedpreference o meglio dentro Application, e richiamarlo nel caso in cui sia null quello recuperato dall'extra. Ma gestirei comunque il caso in cui l'activity sia richiamata senza quell'extra, per evitare in ogni caso le nullpointerexceptions.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AL_94

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 8.1; Mac OS X 10.9
Re:Perdita dell'extra di un Intent
« Risposta #6 il: 15 Agosto 2013, 19:15:42 CEST »
0
Mi potresti gentilmente spiegare come implementare uno di questi due metodi? anche solo se mi passi il link dove ci è presente una piccola spiegazione  :-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AL_94

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 8.1; Mac OS X 10.9
Re:Perdita dell'extra di un Intent
« Risposta #8 il: 15 Agosto 2013, 19:56:57 CEST »
0
Grazie mille per la disponibilità!  :-)