Domanda

Sto facendo alcune attività di rete pesante - il download di immagini (anteprime) - Per la mia principale interfaccia utente di non essere bloccato ha fatto che in un AsyncTask, voglio mettere loro in un GridView, ma ho impostato l'adattatore prima del termine del AsyncTask. Alcuni codice sarà più disponibile

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.gridview);
            new LoadAllPictures().execute();
            GridView g = (GridView) findViewById(R.id.gridview);
            g.setAdapter(new ImageAdapter(this));
}

Così, alla fine degli spettacoli Logcat che tutto era stato dowloaded ma niente sul mio schermo. Ho provato a fare la parte setAdapter nel mio AsyncTask ma mi dice che: Only the original thread that created a view hierarchy can touch its views.

Che cosa devo fare?

È stato utile?

Soluzione

AsyncTask ha un metodo utile è possibile implementare nome onPostExecute(). Si chiama dal thread dell'interfaccia utente originale dopo l'operazione è stata completata. Si può usare per impostare l'adattatore dal thread corretto.

Altri suggerimenti

AsyncTask ha 3 metodi di base:

protected void onPreExecute()
{
}

protected void onPostExecute(Void unused)   
{
  // displaying images
  // set adapter for listview with downloaded items
}

protected Void doInBackground(Void... params) 
{
     // downloading and time consuming task 
}

in modo da poter scrivere g.setAdapter(new ImageAdapter(this)); all'interno del metodo onPostExecute(Void unused) perché in questo momento, le immagini sono già scaricati all'interno del metodo doInBackground().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top