Autore Topic: AsyncTask nel metodo getView non funziona correttamente  (Letto 335 volte)

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
AsyncTask nel metodo getView non funziona correttamente
« il: 19 Maggio 2014, 01:02:04 CEST »
0
Ciao a tutti,
nel costruire la mia app, ho avuto la necessità di creare un semplicissimo spinner adapter in quanto ho bisogno di uno spinner personalizzato per listare dei dati estratti da una query.
Nel mio MainActivity ho creato una classe che estende ArrayAdapter<NomeMioOggetto> per gestire diversi elementi grafici, tra cui lo spinner. Il problema è che, nel metodo getView richiamo un AsyncTask per popolare il mio spinner, ma purtroppo, nonostante in debug venga popolato correttamente tutto, lo spinner appare totalmente vuoto e non capisco il perchè!

Vi posto il codice incriminato (non sto a postarvi tutto perchè credo che non sia necessario):

Codice (Java): [Seleziona]
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {

            // Altro codice
           
            new LoadSpinnerJobs().execute();

            // Altro codice


            return view;
        }


        public class LoadSpinnerJobs extends AsyncTask<Void, Void, List<SpinnerItem>>
        {
            @Override
            protected void onPreExecute()
            {
                super.onPreExecute();

                setProgressBarIndeterminateVisibility(true);
            }

            @Override
            protected List<SpinnerItem> doInBackground(Void... voids)
            {
               
                 // Esecuzione della query

            }

            @Override
            protected void onPostExecute(List<SpinnerItem> result)
            {
                super.onPostExecute(result);

                CustomSpinnerAdapter adapter = new CustomSpinnerAdapter(getContext(), R.layout.custom_spinner_item, result);
                drawerHolder.spinner.setAdapter(adapter);
                drawerHolder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
                {
                    @Override
                    public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3)
                    {
                          // Codice
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> arg0) { }

                });

                setProgressBarIndeterminateVisibility(false);
            }
        }

Ho tolto le parti non necessarie perchè il codice in quel caso è corretto. I dati arrivano in modo corretto ovunque ma nell' onPostExecute c'è assolutamente qualcosa che si perde. Oppure, essendo l'AsyncTask parallelo al MainThread, forse il "return view" all'interno del metodo getView, viene richiamato prima che il task sia terminato...infatti, se al posto della chiamata dell'asynctask, eseguo direttamente la query, funziona tutto correttamente!!!  ???
non so dove sbattere la testa... :-(

Grazie a tutti per l'aiuto!!
TimeReport: your time. In your pocket.

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 nel metodo getView non funziona correttamente
« Risposta #1 il: 19 Maggio 2014, 08:16:38 CEST »
0
Oppure, essendo l'AsyncTask parallelo al MainThread, forse il "return view" all'interno del metodo getView, viene richiamato prima che il task sia terminato...infatti, se al posto della chiamata dell'asynctask, eseguo direttamente la query, funziona tutto correttamente!!!  ???

Questa è praticamente una certezza. Ma come mai hai bisogno di far partire l'asynctask sulla getview? Non puoi farlo partire prima?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:AsyncTask nel metodo getView non funziona correttamente
« Risposta #2 il: 19 Maggio 2014, 13:19:28 CEST »
0
Questa è praticamente una certezza. Ma come mai hai bisogno di far partire l'asynctask sulla getview? Non puoi farlo partire prima?

Innanzitutto ti ringrazio per la risposta!  :-)
Comunque, in realtà lo faccio partire lì semplicemente per comodità e semplicità (anche se a dire il vero, non so quanto sia corretto far partire un asynctask in un metodo come il getview). L'ipotesi di farlo partire prima potrei tranquillamente prenderla in considerazione anche se questa cosa del task parallelo mi "inquieta"...ok che il metodo onPostExecute gestisce tutto ciò che avviene dopo il task, però ho il timore che se la query dovesse diventare esosa (anche se dubito, visto che deve fare una select su una tabella che probabilmente non conterrà mai più di 5 record), si perda via un po' di cose. Ad ogni modo, provo in serata a spostare la chiamata dell'asynctask in un altro posto e vedo come va...poi ti faccio sapere!  ;-)
TimeReport: your time. In your pocket.