2

我正在尝试制作一个简单的应用程序。用户看到一个edittext ..在其中输入一些文本..然后按发送...然后笔记本电脑上的服务器收到该消息。

现在 NetworkOnMainThread 异常让我头疼......该应用程序在 2.3.3 中完美运行,因为当时没有 NetworkOnMainThread 异常之类的东西。

搜索了很多..两个解决方案是

  1. 为网络创建新线程或
  2. 异步任务。

我都试过了,没有任何结果。

尝试 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 以及我尝试过的内容。所以暂时请帮我完成这个简单的发送和接收字符串的任务。

4

1 回答 1

2

不幸的是,sendToClient()在同一个类中定义NetworkThread并不意味着它将在您的网络特定线程上运行。该sendToClient()方法仍将在您的主 (UI) 线程上运行,因为它是从您的onClick()方法中调用的。UI 回调,例如onClick(),总是在 UI 线程上处理。

I would recommend using an AsyncTask as it enables you to send arbitrary data (such as your message parameter) to the background/network thread before it executes. Continuing to use Runnable and Thread will require extra machinery to synchronize the execution of your UI and network threads, and these challenges are handled behind the scenes by AsyncTask.

于 2012-10-13T14:14:37.503 回答