我正在尝试制作一个简单的应用。用户看到一个edittext ...在其中输入一些文本..然后按发送...然后笔记本电脑上的服务器收到该消息。
现在NetworkOnMainThread异常给了我头痛......该应用程序完美适用于2.3.3,因为没有NetworkOnMainThread异常那样的时间。
经过大量搜索..两种解决方案
我试过两次都没有任何结果。
尝试1:使用单独的线程:
现在我能理解的是,我必须开始一个单独的线程。好。我做到了。
以下是我的客户端代码。
EditText e ;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
e= (EditText) findViewById(R.id.editText1);
tv = (TextView) findViewById(R.id.textView1);
Thread startNetworking = new Thread(new NetworkThread());
startNetworking.start();
}
public void sendMessage(View v){
if(NetworkThread.sendToClient(e.getText().toString()))
tv.setText("Status : Successful");
else
tv.setText("Status : Unsuccessful");
}
sendMessage是我的发送按钮的onClick函数。我有另一个JAVA文件NetworkThread.java ....
以下是代码:
public class NetworkThread implements Runnable{
static DatagramSocket socket;
static InetAddress add;
public void run() {
try {
socket = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
add = InetAddress.getByName("192.168.1.12");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static boolean sendToClient(String message){
DatagramPacket p = new DatagramPacket(message.getBytes(),message.getBytes().length,add,4444);
try {
socket.send(p);
return true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
}
这仍然不起作用。我首先想要耗尽这个第一次尝试然后我将继续询问有关AsyncTask和我尝试过的内容。所以暂时请帮我完成发送和接收字符串的简单任务。
答案 0 :(得分:2)
不幸的是,将sendToClient()
定义在与NetworkThread
相同的类中并不意味着它将在您的网络特定线程上运行。 sendToClient()
方法仍将在您的主(UI)线程上运行,因为它是从您的onClick()
方法调用的。 UI回调(例如onClick()
)始终在UI线程上处理。
我建议使用AsyncTask
,因为它可以让您在执行之前将任意数据(例如message
参数)发送到后台/网络线程。继续使用Runnable
和Thread
将需要额外的机制来同步UI和网络线程的执行,这些挑战由AsyncTask
在幕后处理。