Autore Topic: Problema con AsyncTask  (Letto 748 volte)

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Problema con AsyncTask
« il: 18 Giugno 2012, 20:52:19 CEST »
0
Ciao a tutti,
 premetto che non so se questa sia la sezione giusta oppure no.
Ho un problema con degli asynctask che uso per effettuare una richiesta a un server remoto dal quale recupero delle coordinate che inserisco su una mappa.
Il problema e' che ogni tanto, in modo completamente casuale il mio asynctask non ferma il process dialog che avvio nel onPreExecute e dismetto nel onPostExecute e rimane la finestrella che gira fin quando ad un certo punto crasha direttamente la applicazione.
Non penso che sia una cosa valida postarvi tutto il codice perche' e' molto molto lungo quindi cerchero' di descrivervelo nei dettagli.

La mia activity inizialmente crea una mappa e la popola semplicemente con l'overlay che segnala la mia posizione.
A questo punto avvio il mio AsyncTask1 che recupera dal server alcune informazioni (faccio due http request) che sono gli overlay che devo visualizzare e li metto nella mappa. Questo tutto dentro il doInBackground. Nell' onPreExecute creo e lancio il dialogXYZ (variabile globale) che dismetto poi nel mio onPostexecute.

Successivamente l'utente ha la possibilita' di tappare un tasto che avvia l'AsyncTask2 il quale svolge complessivamente lo stesso lavoro del primo, ma con una sola request.
Questo e' quello che mi da problemi. Nella onPreExecute() questa volta reinizializzo la mappa (anche se forse non ce ne era bisogno), ma non penso che questo sia il problema.

La mia app ha sempre funzionato benissimo fino a una settimana fa quando ho scoperto che da android 3.0 e' obbligatorio usare gli AsyncTask per effettuare delle chiamate http request. Io purtroppo ho sviluppato per un tot di mesi su uno smartphone molto vecchio e quindi questo problema non si era mai verificato. Arrivati a poco tempo dal lancio il test su smartphone con android 4.0 e superiori hanno dato dei problemi enormi proprio per questo motivo e ho dovuto trasformare tutte le mie funzioni in AsyncTask...

Avreste qualche consiglio da darmi in merito?
Qualche guida su come impostare un timeout sulla funzione doInBackground()...

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:Problema con AsyncTask
« Risposta #1 il: 19 Giugno 2012, 08:03:47 CEST »
0
La mia app ha sempre funzionato benissimo fino a una settimana fa quando ho scoperto che da android 3.0 e' obbligatorio usare gli AsyncTask per effettuare delle chiamate http request.

In realtà era obbligatorio anche prima, a prescindere da quanto fosse evidente. In questo stesso forum trovi tutorial di due anni fa che già promuovono questo concetto.


Avreste qualche consiglio da darmi in merito?

Dalla descrizione del problema, pare proprio ci sia un bug di principio nel secondo AsyncTask.
Dovresti fare Logging a tappeto per capire cosa va storto, quando va storto e perchè va storto.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con AsyncTask
« Risposta #2 il: 19 Giugno 2012, 16:13:45 CEST »
0
Eh Bradipao, come darti torto! Il punto e' che quando sei alle prime armi con una cosa, non sempre trovi subito la strada perfetta per sviluppare tutto nel migliore dei modi. Io avevo usato delle funzioni che avevo messo direttamente dentro dei thread, proprio perche' avevo letto un po' ovunque di questa necessita' in caso di http request. Non avevo letto che fosse assolutamente necessario usare gli AsyncTask...

Comunque ci sarebbe un modo di interrompere il doInBackground() attraverso un timeout?

Edit:
Secondo voi organizzare un asynctaskt in questo modo potrebbe essere una buona idea? (lo scrivo in pseudocodice)

Codice (Java): [Seleziona]
Asynctask1 {
     onPreExecute(){
         inizializzaMappaConMyPosition
         lancia dialog
     }
   
     doInBackground(){
        recupera dati da server
        traduci da json a arraylist di overlay
        popola la mappa1
     }

     onPostExecute(){
         dismiss dialog
         popola mappa2
     }
}

Meglio usare il popola mappa 1 o il 2?
« Ultima modifica: 19 Giugno 2012, 16:37:40 CEST da Mr.Donut »

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 con AsyncTask
« Risposta #3 il: 19 Giugno 2012, 19:16:55 CEST »
0
Prima cosa: forse ho capito male, ma se già usavi thread secondari, andava benissimo. Asyntask è solamente un modo semplificato di usare thread separati.

Seconda cosa: attenzione, SOLO quello che metti dentro doinbackgrounds gira in un thread a parte, quello che hai in pre e post execute gira nel thread di UI, deve quindi essere qualcosa di molto leggero.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con AsyncTask
« Risposta #4 il: 19 Giugno 2012, 19:37:48 CEST »
0
Prima cosa: forse ho capito male, ma se già usavi thread secondari, andava benissimo. Asyntask è solamente un modo semplificato di usare thread separati.

Guarda usavo i thread secondari e seriamente non funzionava niente su dispositivi con android 4.0 o superiore...
Ho fatto un sacco di prove e niente non sono mai riuscito a giungere a un risultato senza crash!
Poi magari avevo dimenticato qualcosa... Ho veramente scritto troppe righe di codice e comincio a non capire piu' niente >__<

Seconda cosa: attenzione, SOLO quello che metti dentro doinbackgrounds gira in un thread a parte, quello che hai in pre e post execute gira nel thread di UI, deve quindi essere qualcosa di molto leggero.

Si come ho scritto inizializzo la mappa e lancio il dialog nella onPreEx e popolo la mappa e dismetto il dialog nella onPostEx. Tutto il lavoro di recupero informazioni dal server e traduzione di dati da json a java object lo faccio nella doInBackground().


ma i dialog conviene lanciarli nell'onPreExecute() o direttamente nel thread principale?


« Ultima modifica: 19 Giugno 2012, 21:56:53 CEST da Mr.Donut »