2010-12-05 6 views
9

Android noob hier. Ich lerne am besten, indem ich den Quellcode eines funktionalen Beispiels sehe, aber ich konnte kein einfaches, aber vollständiges Beispiel finden, ein Socket in seinem eigenen Thread zu verwenden.Wie bekomme ich Daten zu/von einem Socket in einem Thread?

Ich habe einen Android-Dienst, der mit dem Internet kommunizieren muss. Ich möchte einen TCP-Socket öffnen, der eine Verbindung zu einem Server im Internet herstellt. Der Dienst muss Daten an das Internet senden, und Daten, die vom Netz zurückkommen, müssen zum Dienst gehen. Da der Dienst auch andere Dinge erledigt, muss die Socket-Verbindung in einem eigenen Thread leben.

Irgendeine Idee, wo ich ein Beispiel eines Sockels in einem Thread mit der Kommunikation zu/von der Steckdose finden könnte?

Dank

enter image description here

Antwort

15

Sie müssen einfach Erstellen Sie eine asynchrone Aufgabe, die im Hintergrund kommuniziert und anschließend den UI-Thread bei Bedarf aktualisiert. Hier ist der Hintergrund-Thread Informationen aus einer Steckdose zu bekommen und eine Textansicht mit der Anzahl von Bytes aktualisieren Empfänger

public class InternetTask extends AsyncTask<Void, Integer, Void> { 

    private WeakReference<TextView> mUpdateView; 

    public LoginTask(TextView view) { 
     this.mUpdateView = new WeakReference<TextView>(view); 
    } 

    @Override 
    protected Void doInBackground() { 

     try { 
      Socket socket = new Socket("127.0.0.1", 80); 
        InputStream is = socket.getInputStream(); 

        byte[] buffer = new byte[25]; 
        int read = is.read(buffer); 
        while(read != -1){ 
         publishProgress(read); 
         read = is.read(buffer); 
        } 

        is.close(); 
        socket.close(); 



     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     if(mUpdateView.get() != null && values.length > 0){ 
        mUpdateView.get().setText(values[0].toString()); 
       } 
    } 

} 

Und hier ist, wie Sie diesen Faden

public class TestTab extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.someLayout); 

      TextView textView = (TextView)findViewById(R.id.someid); 
      InternetTask task = new InternetTask(textView); 
      task.execute(); 

    } 
} 
+0

Gibt es eine Möglichkeit, nach dem Start zusätzliche Daten an eine AsyncTask zu senden, damit Daten aus dem Socket gesendet werden können? Ich sehe, wie man publishProgress und onProgressUpdate verwendet, um Daten vom Hintergrund-Thread zum UI-Thread zu bekommen, aber ich sehe nicht, wie man während der Ausführung der Aufgabe in die andere Richtung geht. –

+2

Sie können beliebige andere Methoden für Ihre asynchrone Aufgabe definieren. Sie müssen wissen, dass die Methode doInBackground() die einzige ist, die in einem separaten Thread ausgeführt wird. Sie können die zu sendenden Daten auch im Konstruktor oder in der execute() -Methode übergeben. –

+0

Wenn ich einen Socket in doInBackground() öffne, blockiert dieser neue Thread, bis Daten auf dem Socket eintreffen. Wenn Daten eintreffen, kann ich sie über publishProgress an den UI-Thread senden. Da der Socket in diesem Arbeitsthread erstellt wurde, wie würde ich Daten vom UI-Thread an den Socket senden? Ich habe es mit einem Datenstrom zu tun, daher ist das Senden von Parametern mit dem Befehl execute() gut, aber ich muss ständig Daten an den Socket senden. –

8

Dies ist ein langer Blog zu diesem Thema, in dem sowohl die Server- und Client-Teile angezeigt werden, mit der Socket-Kommunikation über einen separaten Thread gehen.

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

Eine Sache der ist sich bewusst sein, dass, wenn Sie vorbei int s Sie in ein Byte-Reihenfolge Problem führen kann, so, nur einige Tests tun, und ich würde vorschlagen, dass Sie sicherstellen, dass der Server sendet in das Format, das das Android benötigt, falls Sie Server auf mehr als einem Betriebssystem haben.

Für eine einfache Art und Weise, auf dem Android die Byte-Reihenfolge finden Sie diese verwenden können: http://developer.android.com/reference/java/nio/ByteOrder.html

Laut diesem Artikel, Byte-Reihenfolge vertauscht werden zur Optimierung: http://en.wikipedia.org/wiki/Dalvik_(software)

+0

treten würden, das ist das deutlichste Code, den ich gesehen habe, wie man Sockets erstellt. Während das Serverbeispiel zeigt, wie Daten über den Handler an den UI-Thread gesendet werden, zeigt keines der Beispiele, wie Daten vom UI-Thread in den Socket-Thread verschoben werden. –

+0

Sie können View.post verwenden, um zum UI-Thread zurückzukehren, aber diese Seite kann Ihnen auf andere Weise helfen: http://developer.android.com/guide/appendix/faq/commontasks.html#threading –

Verwandte Themen