2013-03-19 95 views
0

首先,我是Android和Java的新手......我正在研究机器人,需要发送无线命令。在尝试了几种方法来做到这一点,并获得大量错误和时间调试(不理解示例代码中发生的一半事件)后,我发现最简单的通信方式就是使用套接字。我遵循教程http://android-er.blogspot.com/2011/01/simple-communication-using.html,它很好用!它确实如此,没有错误,这是一个可喜的解决方案,但不是我想要的。它从Android开始,发送消息到PC,然后等待PC的响应,然后结束,直到再次单击该按钮。我想让它朝相反的方向前进。我试着只是切换代码,但一直在关闭。我终于搞定了,所以当你从android发送消息后,PC响应,然后android自动发送另一条消息,以便它始终等待PC。它不能很好地工作,有时因按钮而崩溃。此外,它不再显示来自PC的消息!我试图把代码的重要部分放入一个线程,所以android永远不需要被触及,并保持循环...我不知道为什么这不起作用,我得到以下错误:将PC循环到Android Socket通信?

11-24 13:21:11.492: E/AndroidRuntime(2656): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

我的整个程序是一个类:

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

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

public class MainActivity extends Activity { 

EditText textOut; 
TextView textIn; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

//textOut = (EditText)findViewById(R.id.textout); 
//Button buttonSend = (Button)findViewById(R.id.send); 
textIn = (TextView)findViewById(R.id.textin); 
//buttonSend.setOnClickListener(buttonSendOnClickListener); 

// start a loop 
new Thread(new Runnable() 
{ 
    public void run() 
    { 
    while (true) 
    { 
    Socket socket = null; 
    DataOutputStream dataOutputStream = null; 
    DataInputStream dataInputStream = null; 

    try { 
     socket = new Socket("192.168.0.9", 8888); 
     dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
     dataOutputStream.writeUTF("Received!"); 
     dataInputStream = new DataInputStream(socket.getInputStream()); 
     textIn.setText(dataInputStream.readUTF()); 

    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finally{ 
     if (socket != null){ 
     try { 
     socket.close(); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     } 

     if (dataOutputStream != null){ 
     try { 
     dataOutputStream.close(); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     } 

     if (dataInputStream != null){ 
     try { 
     dataInputStream.close(); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     } 
    } 
    } 
    } 
}).start(); 
}} 

任何帮助或更好的方法的建议,这样做将是巨大的!谢谢!

回答

0

它不工作,因为您正试图从后台线程更新用户界面,这是不可能的。

textIn.setText(dataInputStream.readUTF()); 

一个可能的解决方案是使用AsyncTask,您可以轻松地在消息交换后更新UI。

编辑:发现this answer这是非常好的

0

尝试改变新的线程来

runOnUiThread(new Runnable() {