Autore Topic: AsyncTask, passaggio di parametri alla Main Activity  (Letto 2252 volte)

Offline max_ace

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 7
AsyncTask, passaggio di parametri alla Main Activity
« il: 05 Giugno 2012, 22:53:25 CEST »
0
Salve a tutti, ho un problema che non riesco a risolvere, cercherò di essere più sintetico possibile nello spiegare:
- Ho una Main Activity che mi gestisce una ListView; i dati che devono popolarla vado a prelevarli lanciando un task dalla Main Activity.
Quei dati nello specifico vengono generati in background (doInBackground). Ecco a questo punto io avrei bisogno di passare questi dati all'attività che ha fatto partire il task, senza utilizzarli nel post-esecuzione (onPostExecute). L'unica soluzione che mi è venuta in mente è questa, che non funziona(ho eliminato alcune parti del codice non essenziali, questo è solo un codice d'esempio del mio problema):

Classe 'Oggetto':
Codice (Java): [Seleziona]
public class Oggetto{
        private String nome;
        private String cognome;
       
        public Oggetto(String nome, String cognome){
        this.nome=nome;
        this.cognome=cognome;
        }
       
        public String getNome(){
                return nome;
        }
        public void setNome(String nome){
                 this.nome=nome;
        }
        public String getCognome(){
                return cognome;
        }
        public void setCognome(String cognome){
                this.cognome=cognome;
        }      
}
Classe 'MioAsyncTask':
Codice (Java): [Seleziona]
public class MioAsyncTask extends AsyncTask<String, Integer, String>{
       
        private ArrayList<Oggetto> o=new ArrayList<Oggetto>(); 
               
        public ArrayList<Oggetto> getO() {
                return o;
        }

        public MyAsyncTask() {
        }

        @Override
        protected String doInBackground(String... params) {
                String v=params[0];
                for(int i=0;i<10;i++){                                         
                        try{
                                Thread.sleep(100);
                                }catch(InterruptedException ie){}                      
                        publishProgress(i);            
                        Oggetto ob=new Oggetto(params[0],params[0]);
                        o.add(ob);
                }
               
                return v;
        }              
       
        @Override
        public void onPostExecute(String result){
                Oggetto o1=o.get(0);
                txt.setText(o1.getCognome());
               
        }
       
        protected void onProgressUpdate(Integer... values) {
                pb.setProgress(values[0]);
        }
Classe 'Main Activity':
Codice (Java): [Seleziona]
public class MainActivity extends Activity{
       
        MyAsyncTask task;
       
        private ArrayList<Oggetto> o =new ArrayList<Oggetto>();

        public void onCreate(Bundle b){
                super.onCreate(b);
                setContentView(R.layout.main);
                task=new MyAsyncTask();
                task.execute("stringa");               
               
                if(task.getStatus()==Status.FINISHED){
                        o=task.getO();
                        Oggetto o=o.get(0);
                        txt.setText(o.getNome());
                        txt1.setText(o.getCognome());
                }
        }

Ho tralasciato le listview perchè non servono al fine del problema, per il resto spero di essermi spiegato bene e ringrazio chiunque mi possa dare un consiglio per risolvere il tutto!  :D

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:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #1 il: 06 Giugno 2012, 07:50:01 CEST »
0
Non so se ho capito bene, ma hai provato a creare e riempire l'ArrayList nell'AsyncTask e poi passarlo all'activity in fase di postExecute?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline max_ace

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 7
Re:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #2 il: 06 Giugno 2012, 10:20:29 CEST »
0
Esatto è proprio quello che devo fare, ho riempito l'ArrayList nell'AsyncTask e adesso devo passarlo alla Main Activity che ha richiamato il task, perchè ho esigenze di utilizzarlo proprio li nel Main! Il problema è: come passare l'ArrayList all'Activity nel postExecute del task...
Purtroppo gli AsyncTask sono un argomento che non ho ancora ben chiaro... :-\

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:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #3 il: 06 Giugno 2012, 10:25:29 CEST »
0
Esatto è proprio quello che devo fare, ho riempito l'ArrayList nell'AsyncTask e adesso devo passarlo alla Main Activity che ha richiamato il task, perchè ho esigenze di utilizzarlo proprio li nel Main! Il problema è: come passare l'ArrayList all'Activity nel postExecute del task...
Purtroppo gli AsyncTask sono un argomento che non ho ancora ben chiaro... :-\

Io in una mia app ho esteso l'oggetto Application per memorizzarci il suddetto ArrayList così da renderlo accessibile a tutte le activity dell'app. E' un metodo un po' rozzo, ma si adattava molto bene al mio caso.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline max_ace

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 7
Re:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #4 il: 06 Giugno 2012, 10:40:53 CEST »
0
Vediamo se ho capito bene, dovrei crearmi un nuovo oggetto appositamente per memorizzarci l'ArrayList ed estenderlo ad Application, in quel modo posso accedervi dalla Main Activity, subito dopo aver completato il task? Adesso provo, e ti faccio sapere se funziona, per adesso grazie per le risposte :D

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #5 il: 06 Giugno 2012, 10:42:47 CEST »
0
Alternativamente potresti passare un riferimenti all'activity nel costruttore dell'asynctask:

Codice (Java): [Seleziona]
class MyActivity extends Activity{


        //.....

        public aggiornaDati(List<Oggetto> array){
                //Fai quello che devi
        }

}


public class MioAsyncTask extends AsyncTask<String, Integer, String>{

        MyActivity mActivity;
       
        public MyAsyncTask(MyActivity activity) {
        mActivity = activity;
        }

        //....
       
        @Override
    public void onPostExecute(String result){
               mActivity.aggiornaDati(....);
    }


}
« Ultima modifica: 06 Giugno 2012, 10:44:41 CEST da Ricky` »

Offline max_ace

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 7
Re:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #6 il: 06 Giugno 2012, 11:22:10 CEST »
0
Ho provato ad applicare questa soluzione, passando i riferimenti all'activity, ma ho avuto questo errore che mi si è verificato anche ieri provando ad applicare una soluzione simile a quella che mi hai proposto:

FATAL EXEPTION: main
E/AndroidRuntime(339): java.lang.RuntimeException: Unable to start activity ComponentInfo{mio.pack/mio.pack.Completato}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0


Il codice è:

Main Activity:
Codice (Java): [Seleziona]
public class MainActivity extends Activity{
       
        MyAsyncTask task;
       
        private ArrayList<Oggetto> o =new ArrayList<Oggetto>();

        public void onCreate(Bundle b){
                super.onCreate(b);
                setContentView(R.layout.main);
                task=new MyAsyncTask(this);
                task.execute("stringa");

                                //se qua metto la condizione if(task.getStatus()==Status.FINISHED) non entra nel blocco if
                                //in quanto la condizione mi risulta sempre negativa
                                Oggetto obj=oggetto.get(0);
                                tx.setText(obj.getNome());
                               
        }                                      
                                public void AggiornaDati(ArrayList<Oggetto> array){
                                this.oggetto=oggetto;
                                }              
}
MioAsyncTask:
Codice (Java): [Seleziona]
public class MioAsyncTask extends AsyncTask<String, Integer, String>{
               
        private ArrayList<Oggetto> o=new ArrayList<Oggetto>(); 
       
        MainActivity ma;
       
        Oggetto oggetto;
       

        public MyAsyncTask(MainActivity ma) {
                this.ma=ma;
        }

        @Override
        protected String doInBackground(String... params) {
                String v=params[0];
                        oggetto=new Oggetto(params[0],params[0]);
                        o.add(oggetto);
                }              
                return v;
        }              
       
       
        @Override
        public void onPostExecute(String result){
                ma.AggiornaDati(o);
                oggetto=o.get(0);
                txt.setText(oggetto.getCognome());
               
        }
}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #7 il: 06 Giugno 2012, 11:42:53 CEST »
0
Questo non è un problema relativo alla soluzione che ti ho proposto.
Semplicemente si arrabbia perchè cerchi di accedere ad un elemento di un array che in realtà è vuoto.

Offline max_ace

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 7
Re:AsyncTask, passaggio di parametri alla Main Activity
« Risposta #8 il: 06 Giugno 2012, 11:48:13 CEST »
0
Oddio che errore che ho fatto, è vero, scusa me ne sono accorto dopo che ho postato la risposta, ho implementato la tua soluzione correttamente e funziona!
Ho risolto, grazie a tutti per avermi dato una mano, buona giornata!  ;-)