2010-12-05 62 views
9

Android noob here。通過查看功能示例的源代碼,我學到了最好的東西,但我一直無法找到在其自己的線程中使用套接字的簡單但完整的示例。如何從線程中的套接字獲取數據?

我有一個需要與互聯網通信的Android服務。我想打開連接到Internet上的服務器的TCP套接字。該服務需要將數據發送到Internet,並且從網絡返回的數據將需要到該服務。由於服務也在做其他事情,因此套接字連接需要在自己的線程中生存。

任何想法,我可以找到一個套接字的例子在一個線程與通信/從套接字?

感謝

enter image description here

回答

15

你只需要創建一個在後臺進行通信的異步任務,然後根據需要更新UI線程。這裏是後臺線程從套接字獲取信息,並與它的接收器

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()); 
       } 
    } 

} 

的字節數更新文本視圖這裏是你會怎麼踢的線頭脫落

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(); 

    } 
} 
8

這裏是關於這個問題,在服務器和客戶端兩個部分都出現了,與插座的溝通會在一個單獨的線程長的博客。

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

有一點要注意的是,如果你逝去的int是你可能會碰到字節順序的問題,所以,只是做了一些測試,我建議你確保服務器在發送這是Android需要的格式,以防萬一您的服務器位於多個操作系統上。

一個簡單的方法,在Android上找到您可以使用此字節順序:http://developer.android.com/reference/java/nio/ByteOrder.html

根據這篇文章,字節順序可以互換優化: http://en.wikipedia.org/wiki/Dalvik_(software)

+0

這是最清楚的我見過的代碼展示瞭如何創建套接字。但是,雖然服務器示例顯示如何將數據發送回UI線程(通過處理程序),但這兩個示例都沒有顯示如何將數據從UI線程移動到套接字線程。 – 2010-12-05 06:25:01

+0

您可以使用View.post返回UI線程,但此頁面可能以其他方式幫助您:http://developer.android.com/guide/appendix/faq/commontasks.html#threading – 2010-12-05 15:27:03

相關問題