Autore Topic: Restituzione dati da AsyncTask  (Letto 926 volte)

Offline DocTerror

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, G1
  • Sistema operativo:
    Ubuntu / Windows XP
Restituzione dati da AsyncTask
« il: 26 Luglio 2010, 14:07:17 CEST »
0
Buongiorno a tutti,
Il mio problema è il seguente:
Ho la finestra main con all'interno un TextView e la chiamata a AsyncTask.
All'interno di AsyncTask c'è un listener UDP che attende l'arrivo dei pacchetti per promptarli sulla textView ma, questo non succede, semplicemente passa oltre non attendendo l'arrivo dei pacchetti.
Se utilizzo invece un Thread per la cosa riesco a scrivere su un file di testo i valori che arrivano tramite UDP ma non riesco a visualizzarli sulla TextView.
Ho cercato di fare la cosa utilizzando vari snipplet da questo forum più altre cose... non so dove sbaglio ma lo faccio :'(.

Insomma, non so come trovare una soluzione. Sono alle prime armi ma non mi arrendo.

Secondo Voi dov'è il problema? Se qualcuno mi potesse aiutare sarebbe fantastico e poi potrebbe essere utilizzato anche da altri che incontrano questo problema.

Posto il codice di come è adesso:
Codice (Java): [Seleziona]
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Random;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Demo extends Activity {

        TextView loadingTv;

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

                loadingTv = (TextView) findViewById(R.id.loadingTv);
                Button start = (Button) findViewById(R.id.startButton);

                start.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View arg0) {
                                LoadingStuffTask task = new LoadingStuffTask();
                                task.execute("Process started!");
                //la stringa verra passata al metodo doInBackground del nostro AsyncTask
                //per controllare lo stato del task, possiamo chiamare task.getStatus()

                        }
                });

        }

        private class LoadingStuffTask extends AsyncTask<String, String, String> {
        // I tre tipi da dichiarare sono relativamente (in questo caso usiamo solo stringhe)
        // il parametro in entrata di doInBackground  (quando chiamiamo execute passiamo una stringa)
        // il paramentro in entrata di onProgressUpdate (dati che vogliamo mostrare all' utente -opzionale,potremmo usare variabili globali-)
        // il parametro in entrata di onPostExecure (una volta finito il task, potremmo voler mostrare un risultato all'utente)
        // nel caso non volessimo usare parametri di alcun genere tipizziamo con Void,Void,Void (passeremo poi dei null come parametri)

                @Override
                protected String doInBackground(String... params) {
                        publishProgress("\n" + params[0]);
                        // stringa passata a onProgressUpdate
                byte[] buf = new byte[100];
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
        try {
                DatagramSocket socket;
                socket = new DatagramSocket(10000);//(SERVERPORT, serverAddr);
            socket.receive(packet);
            publishProgress(new String(packet.getData()).trim());
            //write("'" + new String(packet.getData()).trim() + "'");
            //URL=new String(packet.getData()).trim();
            socket.close();
               
        } catch (IOException e) {
               
        } catch (Exception u) {
        }
               
   
                        Random rand = new Random();

                        publishProgress("Ho saltato tutto!");

                        return "Finish !";
                        // stringa passata a onPostExecute
                }

                @Override
                protected void onProgressUpdate(String... values) {
                        loadingTv.append(values[0] + "\n");
                }

                @Override
                protected void onPostExecute(String result) {
                        loadingTv.append(result + "\n");
                }

        }

}

Grazie a tutti quelli che vorranno sbatterci la testa o risolvere.  ;-)

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:Restituzione dati da AsyncTask
« Risposta #1 il: 16 Dicembre 2011, 12:49:08 CET »
0
ciao DocTerror,
per quanto riguarda l'uso dei thread, essi non possono modificare direttamente l'interfaccia utente. Perciò bisogna utilizzare un handler per modificare gli aspetti grafici.
Sicuramente avrai già da tempo trovato la soluzione al tuo problema.
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.