Autore Topic: Utilizzare una variabile del main thread nell'asynctask  (Letto 664 volte)

Offline pibraccus

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note
  • Sistema operativo:
    Windows
Utilizzare una variabile del main thread nell'asynctask
« il: 30 Settembre 2012, 18:11:14 CEST »
0
Ciao a tutti! Ho un problema dovuta alla mia ignoranza di base sulla programmazione ad oggetti: da una activity faccio partire in esecuzione un asynctask che mi scarica un oggetto Json e una immagine. Fin qui tutto ok e funziona regolarmente. Il problema sta nel fatto che l'url da cui scaricarsi i dati lo inserisco manualmente io all'interno dell'asynctask invece io vorrei che questo valore venisse impostato attraverso una variabile che ho nella classe  dell'activity. Come si fa?

Di seguito vi posto il codice che ho creato che mi ritorna sempre una messaggio di nullpointer exception e mi manda in crash l'app:

activity Strutture:

Codice (Java): [Seleziona]
public class Strutture extends ThumbnailActivity {

        String url;

@Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_strutture);

                Bundle extras = getIntent().getExtras();
                url = extras.getString("Url");
                final ArrayAdapter<StrutturaClasse> adapter = new AdapterWithImage(this);
                setListAdapter(adapter);

                new DownloadStrutturaAsyncTask(adapter,
                                (ThumbnailAdapter) getListAdapter()).execute();

        };

        @Override
        protected int[] getImageIdArray() {
                return new int[] { R.id.image };
        }

}


Classe downloadStrutturaAsyncTask:

Codice (Java): [Seleziona]
public final class DownloadStrutturaAsyncTask extends
                AsyncTask<Void, StrutturaClasse, Void> {

        private final ArrayAdapter<StrutturaClasse> adapter;


        private ThumbnailAdapter thumbnailAdapter;

        public DownloadStrutturaAsyncTask(ArrayAdapter<StrutturaClasse> adapter,
                        ThumbnailAdapter thumbnailAdapter) {
                this.adapter = adapter;
                this.thumbnailAdapter = thumbnailAdapter;
        }
       

        @Override
        protected Void doInBackground(Void... params) {
               
                try {
                        Strutture a = new Strutture();
                        a.getApplicationContext();
                        String ind = a.url;
                       
                       
                       
                        JSONObject obj = getJSONObject(ind);
                        JSONArray jsonArray = obj.getJSONArray("results");
                        for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                StrutturaClasse t = new StrutturaClasse();
                                t.setNome(jsonObject.getString("Nome"));
                                t.setIndirizzo(jsonObject.getString("Indirizzo"));
                                t.setNumerocivico(jsonObject.getString("NumeroCivico"));
                                t.setComune(jsonObject.getString("Comune"));
                                t.setCap(jsonObject.getString("CAP"));
                                t.setImmagine(jsonObject.getString("immagine"));
                                t.setLatitudine(jsonObject.getString("Latitudine"));
                                t.setLongitudine(jsonObject.getString("Longitudine"));
                               
                               
                       

                                publishProgress(t);
                        }
                } catch (IOException ignored) {
                } catch (JSONException ignored) {
                }
                return null;
        }

@Override
        protected void onProgressUpdate(StrutturaClasse... values) {
                for (StrutturaClasse a : values) {
                        adapter.add(a);
                }
                thumbnailAdapter.notifyDataSetChanged();

        }

        private static JSONObject getJSONObject(String url) throws IOException,
                        MalformedURLException, JSONException {
                HttpURLConnection conn = (HttpURLConnection) new URL(url)
                                .openConnection();

                InputStream in = conn.getInputStream();

                try {
                        StringBuilder sb = new StringBuilder();
                        BufferedReader r = new BufferedReader(new InputStreamReader(
                                        new DoneHandlerInputStream(in)));
                        for (String line = r.readLine(); line != null; line = r.readLine()) {
                                sb.append(line);
                        }
                        return new JSONObject(sb.toString());
                } finally {
                        in.close();
                }
        }
}

classe AdapterWithImage:

Codice (Java): [Seleziona]
public final class AdapterWithImage extends ArrayAdapter<StrutturaClasse> {

        public AdapterWithImage(Context context) {
                super(context, R.layout.elementolistastrutture, R.id.nome);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

                convertView = super.getView(position, convertView, parent);
                StrutturaClasse t = getItem(position);

                TextView nome = (TextView) convertView.findViewById(R.id.nome);
                nome.setText(t.getNome());
                TextView indirizzo = (TextView) convertView
                                .findViewById(R.id.indirizzo);
                indirizzo.setText(t.getIndirizzo() + ", " + t.getNumerocivico());
                TextView CAP = (TextView) convertView.findViewById(R.id.cap);
                CAP.setText(t.getCap());
                TextView Comune = (TextView) convertView.findViewById(R.id.comune);
                Comune.setText(t.getComune());
                ImageView image = (ImageView) convertView.findViewById(R.id.image);
                image.setTag(t.getImmagine());
                image.setImageDrawable(null);
                return convertView;
        }
}
Non credo sia necessario postare anche gli xml.

Chiaramente il valore della stringa url lo prendo da un'altra activity che ha richiamato quella in oggetto attraverso un intent.

Già che ci sono, sempre se non vado off topic, mi potreste suggerire come si fa a impostare il listener per questo adapter? Grazie mille in anticipo per le eventuali risposte. Ciaoooo!
 

Offline pibraccus

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note
  • Sistema operativo:
    Windows
Re:Utilizzare una variabile del main thread nell'asynctask
« Risposta #1 il: 01 Ottobre 2012, 13:51:04 CEST »
0
Ciao a tutti ragazzi,

sono riuscito a risolvere il mio problema! Ecco la soluzione (banalissima peraltro):

Codice (Java): [Seleziona]
new DownloadStrutturaAsyncTask(adapter, url,
                                (ThumbnailAdapter) getListAdapter()).execute();

e nell'asynctask:

Codice (Java): [Seleziona]
public DownloadStrutturaAsyncTask(ArrayAdapter<StrutturaClasse> adapter,
                        String url, ThumbnailAdapter thumbnailAdapter) {
                this.adapter = adapter;
                this.thumbnailAdapter = thumbnailAdapter;
                this.url = url;
        }

non prima di aver dichiarato una variabile url di tipo string.

Ciaooo!!!