Autore Topic: problema ripresa del gioco dopo spegnimento schermo  (Letto 470 volte)

Offline metal90

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
problema ripresa del gioco dopo spegnimento schermo
« il: 14 Marzo 2014, 17:20:20 CET »
0
Ragazzi ho un problema. Sto lavorando allo sviluppo di un semplice gioco per Android. Funziona tutto bene. Tuttavia quando premo il tasto di accensione del cellulare, provocando lo spegnimento dello schermo mentre sto giocando, al ravvio mi da errore impossibile avviare l'applicazione.
Come ho capito quando premo il tasto di accensione giustamente viene chiamato il metodo onPause(). In questo metodo implemento il salvataggio mediante SharedPreference di tutti i dati che mi servono.
In generale quando viene chiamato il metodo onPause tutto funziona bene (ad esempio se mentre gioco premo il tasto home e poi rientro il gioco riparte tranquillamente o ancora se mentre gioco ricevo una chiamata posso rispondere e poi riprendere il gioco senza problemi).
Ma quando questo metodo viene chiamato in seguito alla pressione del tasto di accensione, alla riaccensione dello schermo mi dice che è impossibile avviare l'applicazione.
Inoltre ho notato che è proprio la sequenza di chiamate di sharedPreferences per salvare i dati che mi da il problema. Cioè se commento questa parte di codice (interna sempre a onPause()) e premo il tasto di accenssione, quando poi riaccendo il cellulare questo riesce a far ripartire l'applicazione ma il gioco giustamente ricomincia tutto d'accapo.
Forse sono troppi i dati da salvare e lo spegnimento non da il tempo di salvare tutto provocnado l'errore? E' possibile rinviare di qualche frazione di secondo lo spegnimento del cellulare in modo da dare il tepo di salvare tutto senza problemi (sempre che questo sia il problema) ?

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:problema ripresa del gioco dopo spegnimento schermo
« Risposta #1 il: 14 Marzo 2014, 17:37:09 CET »
0
Ti consiglio di riprodurre il problema in modalità debug collegando il cellulare al pc dove sviluppi, e nel LogCat vedrai esattamente cosa crea il problema. Indovinarlo da una descrizione a parole è veramente arduo.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline metal90

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:problema ripresa del gioco dopo spegnimento schermo
« Risposta #2 il: 15 Marzo 2014, 09:11:30 CET »
0
il log out che viene prodotto è il seguente, io non ci capisco molto (sembra però che tenta di chiamare onCreate dopo che l'applicazione è stata gia chiusa col cell spento...boh), spero che ci sia qualcuno che riesce a tradurre questo log out per me. Aggiungo che questo log out compare immediatamente dopo aver premuto il tasto di avvio.
(Il LogOut "SALVATAGGIO COMPLETO" è nel metoto onPause esattamente dopo che tutti le operazione di SharedPreferences sono terminate correttamente con edit.commit()).

03-15 09:06:50.169: V/MyActivity(2928): AVVIO ONPAUSE()
03-15 09:06:50.629: V/ MyActivity (2928): SALVATAGGIO COMPLETO
03-15 09:06:50.629: V/ MyActivity (2928): AVVIO ONDESTROY()
03-15 09:06:50.969: D/-heap(2928): GC_EXPLICIT freed 894K, 53% free 10531K/22051K, paused 4ms+37ms
03-15 09:06:51.099: D/-heap(2928): GC_EXPLICIT freed 63K, 53% free 10467K/22051K, paused 9ms+4ms
03-15 09:06:51.389: D/MediaPlayer(2928): stop() mUri is null
03-15 09:06:51.409: V/ MyActivity (2928): AVVIO ONDESTROY()
03-15 09:06:51.879: D/-heap(2928): GC_EXPLICIT freed 3423K, 69% free 7054K/22051K, paused 6ms+44ms
03-15 09:06:52.039: D/-heap(2928): GC_EXPLICIT freed 7K, 69% free 7046K/22051K, paused 3ms+4ms
03-15 09:06:52.099: D/-heap(2928): GC_EXPLICIT freed 0K, 69% free 7046K/22051K, paused 3ms+4ms
03-15 09:06:52.149: D/-heap(2928): GC_EXPLICIT freed 0K, 69% free 7046K/22051K, paused 3ms+4ms
03-15 09:06:52.169: D/memalloc(2928): /dev/pmem: Unmapping buffer base:0x520b2000 size:1187840 offset:880640
03-15 09:06:52.169: D/memalloc(2928): /dev/pmem: Unmapping buffer base:0x51edb000 size:880640 offset:573440
03-15 09:06:52.209: D/memalloc(2928): /dev/pmem: Unmapping buffer base:0x51a9e000 size:2416640 offset:1802240
03-15 09:06:52.209: D/memalloc(2928): /dev/pmem: Unmapping buffer base:0x529a5000 size:7364608 offset:6750208
03-15 09:06:52.309: V/ MyActivity (2928): AVVIO ONCREATE()
03-15 09:06:52.309: V/ MyActivity (2928): AVVIO ONRESUME()
03-15 09:06:52.319: V/ MyActivity (2928): AVVIO ONPAUSE()
03-15 09:06:52.329: W/dalvikvm(2928): threadid=1: thread exiting with uncaught exception (group=0x40ade9f0)
03-15 09:06:52.339: E/AndroidRuntime(2928): FATAL EXCEPTION: main
03-15 09:06:52.339: E/AndroidRuntime(2928): java.lang.RuntimeException: Unable to pause activity {com.example.rotomind/com.example.rotomind.MainActivity}: java.lang.NullPointerException
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2015)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3351)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.ActivityThread.access$700(ActivityThread.java:123)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.os.Looper.loop(Looper.java:137)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.ActivityThread.main(ActivityThread.java:4424)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at java.lang.reflect.Method.invokeNative(Native Method)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at java.lang.reflect.Method.invoke(Method.java:511)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at dalvik.system.NativeStart.main(Native Method)
03-15 09:06:52.339: E/AndroidRuntime(2928): Caused by: java.lang.NullPointerException
03-15 09:06:52.339: E/AndroidRuntime(2928):    at com.example.rotomind.GameView.salvaStato(GameView.java:2083)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at com.example.rotomind.MainActivity.onPause(MainActivity.java:119)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.Activity.performPause(Activity.java:4568)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1195)
03-15 09:06:52.339: E/AndroidRuntime(2928):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2000)
03-15 09:06:52.339: E/AndroidRuntime(2928):    ... 11 more8):    ... 10 more


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:problema ripresa del gioco dopo spegnimento schermo
« Risposta #3 il: 15 Marzo 2014, 12:07:29 CET »
0
C'è un errore nel metodo OnPause(), devi rivedere un po' il codice. Magari provarlo fuori dal metodo stesso associato ad un button, per scroprire dove sbagli.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline metal90

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:problema ripresa del gioco dopo spegnimento schermo
« Risposta #4 il: 17 Marzo 2014, 08:23:54 CET »
0
Dopo diversi giorni di ricerca su Internet ho capito qual'è il problema, ma non so come rislverlo. In pratica è dovuto al forzamento dell'orientamento dello schermo in orizzontale (in landscape). Infatti, il mio gioco funziona solo ed esclusivamente in orizzontale e come ho capito quando si preme il tasto di accensione il salva schermo di android litiga con la mia applicazione per motivi a me oscuri provocando il crash del gioco. Ho provato a rimuovere la forzatura a landscape e il gioco (solo ed esclusivamente in posizione verticale) dopo lo spegnimento dello schermo e la sua successiva riaccensione riprende correttamente a funzionare. La forzatura in orizzontale è provocata da questa riga nel manifest file:

 <activity android:screenOrientation="landscape">

ovviamente non posso togliere questa riga perchè il gioco funziona e deve funzionare solo ed esclusivamente in orizzontale...ma quindi come faccio a rilasciare la forzatura dello schermo in orizzantale quando viene chiamato il metodo onPause() ??

------------------------------------
Ho appena risolto il problema del blocco aggiungendo la riga android:configChanges="orientation|keyboardHidden|screenSize" come di seguito nel manifest file. Purtroppo però adesso quando riaccendo il display il gioco non crasha più ma tutte le coordinate degli oggetti posizionati sono sballate. Forse fa un errore di salvataggio o caricamento dei dati a causa della rotazione dello schermo. Come posso fare per evitare ciò???

<activity
            android:name="com.example.game.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="landscape"
            android:configChanges="orientation|keyboardHidden|screenSize">

--------------------------------------

Risolto anche l'ultimo problema...semplicemente nel codice facevo riferimento alle dimensioni dello schermo tenendo a mente solo l'orientamento orizzontale...è bastato aggiungere qualche controllo ed è tutto ok!
« Ultima modifica: 17 Marzo 2014, 11:13:12 CET da metal90 »