Autore Topic: Conversione di una Stringa in Intero per inserimento evento nel calendario  (Letto 857 volte)

Offline fvlgnn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy SII
Ciao a tutti,
sto sviluppando un applicazione che preleva un array in json su un server esterno ed esegue un parsing dei vari elementi. Fin qui tutto bene. Uno di questi elementi dell'array è una stringa riportante una data scritta in formato epoch. Ho scritto la data in epoch perchè quello che ho capito il calendario di Android lavora in epoch. Il problema è che l'inserimento dell'evento nel calendario funziona ma la data non riesco a farla inserire in automatico, mentre se converto la stringa in numero intero l'applicazione si blocca e viene arresta da Android.

Questo è il pezzo del mio condice incriminato che blocca l'applicazione.

Codice (Java): [Seleziona]
...
//prelevo l'array in json e faccio il parsing
// la data arriva in questo formato "datainizio": "1354878000"
map.put("datainizio", e.getString("datainiziojson"));
...
//converto la stringa in intero
int databegcal = Integer.parseInt("datainizio");
/*
//ho provato anche così
int databegcal = 0;
databegcal = Integer.parseInt("datainizio");
*/

...
//scrivo l'evento in calendario
evento.putExtra("beginTime", databegcal);
...

Ho notato che l'applicazione si blocca anche se provo a fare solo la conversione da stringa in intero. Sicuramente sbaglio qualcosa di molto logico e banale ad uno sviluppatore esperto ma io che non lo sono ho grosse difficoltà a capire lo sbaglio.

Il LogCat infatti dice che il problema è nella conversione.

Codice (Text): [Seleziona]
12-03 11:08:14.255: I/dalvikvm(10308): Turning on JNI app bug workarounds for target SDK version 8...
12-03 11:08:14.400: E/log_tag(10308): Error parsing data org.json.JSONException: Value at 2 is null.
12-03 11:08:14.495: D/CLIPBOARD(10308): Hide Clipboard dialog at Starting input: finished by someone else... !
12-03 11:08:15.470: D/AndroidRuntime(10308): Shutting down VM
12-03 11:08:15.470: W/dalvikvm(10308): threadid=1: thread exiting with uncaught exception (group=0x40c641f8)
12-03 11:08:15.480: E/AndroidRuntime(10308): FATAL EXCEPTION: main
12-03 11:08:15.480: E/AndroidRuntime(10308): java.lang.NumberFormatException: Invalid int: "databegcal"
12-03 11:08:15.480: E/AndroidRuntime(10308):    at java.lang.Integer.invalidInt(Integer.java:138)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at java.lang.Integer.parse(Integer.java:375)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at java.lang.Integer.parseInt(Integer.java:366)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at java.lang.Integer.parseInt(Integer.java:332)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at com.cianadroid.ceis.events.Main$1.onItemClick(Main.java:104)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.widget.AdapterView.performItemClick(AdapterView.java:292)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.widget.AbsListView.performItemClick(AbsListView.java:1181)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2709)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.widget.AbsListView$1.run(AbsListView.java:3464)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.os.Handler.handleCallback(Handler.java:605)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.os.Looper.loop(Looper.java:137)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at android.app.ActivityThread.main(ActivityThread.java:4511)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at java.lang.reflect.Method.invokeNative(Native Method)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at java.lang.reflect.Method.invoke(Method.java:511)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
12-03 11:08:15.480: E/AndroidRuntime(10308):    at dalvik.system.NativeStart.main(Native Method)

Grazie per l'aiuto,
Gianni
« Ultima modifica: 03 Dicembre 2012, 11:29:41 CET da fvlgnn »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Conversione di una Stringa in Intero per inserimento evento nel calendario
« Risposta #1 il: 03 Dicembre 2012, 11:35:55 CET »
+1
Codice (Java): [Seleziona]
int databegcal = Integer.parseInt(e.getString("datainiziojson"));
"datainizio" non è una stringa che rappresenta un numero, è giusto che ti esploda tutto quando ci fai sopra il parseInt.

PS: sicuro che non sia più corretto usare un long invece che un int? Formalmente le date in millisecondi in java sono long.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Conversione di una Stringa in Intero per inserimento evento nel calendario
« Risposta #2 il: 03 Dicembre 2012, 11:38:03 CET »
0
allora, intanto un consiglio:
Quando un'applicazione "si blocca" ti viene stampato un log nel cosiddetto logcat. Questo logcat è necessario per poter capire la natura dell'errore e come sistemarlo. Senza è QUASI impossibile aiutarti.

In questo caso ti posso aiutare lo stesso perchè l'errore è più dovuto ad una conoscenza generica java che dello specifico in android, ma ti pregherei per completezza di allegare il logcat.

Se il codice che hai postato è esattamente quello che usi, l'errore è dato dal fatto che stai parsando "datainizio" e non il valore di data inizio.
per parsare il valore devi fare: e.getString("datainiziojson") oppure map.get("datainizio")

Ad ogni modo, è sbagliato usare Integer come valore per le date, si usa un long, e lo puoi capire dal metodo usato per prendere il "now" in formato numerico: System | Android Developers()

IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline fvlgnn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy SII
Re:Conversione di una Stringa in Intero per inserimento evento nel calendario
« Risposta #3 il: 04 Dicembre 2012, 12:04:08 CET »
0
Grazie dell'aiuto.
Il mio manuale Java che sto consultando dice di fare una cosa del genere:
Codice (Java): [Seleziona]
long tipolong;
int tipoint;
char tipochar;
//Cast di un tipo long in un tipo int
tipolong = Long.MAX_VALUE;
tipoint = (int) tipolong;
//Cast di un tipo int in un tipo long
tipoint = Integer.MAX_VALUE;
tipolong = (long) tipoint;
//Cast di un tipo char in un tipo int
tipochar='A';
tipoint = (int)tipochar;
System.out.println("La variabile
Risultato dell'esempio è il seguente
La variabile di tipo long vale: 9223372036854775807, La variabile di tipo int vale: -1
La variabile di tipo long vale: 2147483647, La variabile di tipo int vale: 2147483647
La variabile di tipo char vale: A, La variabile di tipo int vale: 65

Nel mio codice ho fatto una modifica di questo tipo
Codice (Java): [Seleziona]
...
//prelevo l'array in json e faccio il parsing
// la data arriva in questo formato "datainizio": "1354878000"
map.put("datainizio", e.getString("datainizio"));
...
//converto la stringa in intero
long databeg = Integer.parseInt(o.get("datainizio"));
...
//scrivo l'evento in calendario
evento.putExtra("beginTime", databeg);
...
Adesso riesco ad inserire la data personalizzata nel calendario ma parte è del 16 gennaio 1970 credo che nella conversione vengano persi alcuni valori. Sbaglio ancora qualcosa?
Ho provato anche così che forse è la soluzione migliore da quello che mi ha scritto Nicola_D
Codice (Java): [Seleziona]
long databeg = Long.parseLong(o.get("datainizio"));Ma ho lo stesso risultato. Il codice che ho scritto è corretto?
« Ultima modifica: 04 Dicembre 2012, 12:15:18 CET da fvlgnn »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Conversione di una Stringa in Intero per inserimento evento nel calendario
« Risposta #4 il: 04 Dicembre 2012, 12:30:06 CET »
+2
dal codice che hai inserito col commento, mi pare di vedere che non ti arrivino i millisecondi, ma i secondi.
se inserisci il tuo valore qui: Online conversion between a java.util.Date and milliseconds
ti viene fuori 16 gennaio.
Se invece al tuo valore aggiungi 3 zeri viene: venerdì 7 dicembre 2012 11.00.00 GMT
che credo sia la tua data desiderata.
In questo caso il problema è lato server, ossia ti invia i secondi e non i millisecondi. A far bene va modificato lato server, se non puoi ti tocca fare il parseLong e poi *1000.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline fvlgnn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy SII
Re:Conversione di una Stringa in Intero per inserimento evento nel calendario
« Risposta #5 il: 04 Dicembre 2012, 12:44:49 CET »
0
Sì Nicola_D, è il mio server PHP che si perde gli zeri o meglio il date('U') di PHP scrive la data in epoch ma in secondi e non in millisecondi, non ci avevo fatto caso. Lato server si può risolvere eseguendo la moltiplicazione con il mktime di PHP o con una moltiplicazione aritmetica. Sembra funzionare sia con la modifica lato server che con il *1000 sul codice.
Per i posteri ho usato questa soluzione.
Codice (Java): [Seleziona]
// con possibilità di modificare l'array json lato server
long databeg = Long.parseLong(o.get("datainizio"));

Codice (Java): [Seleziona]
// senza possibilità di modificare l'array lato server
long databeg = Long.parseLong(o.get("datainizio")) * 1000;
Grazie infinite,
Gianni
« Ultima modifica: 04 Dicembre 2012, 17:08:09 CET da fvlgnn »