2010-12-05 84 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