在Android中使用数据报的简单网络

时间:2012-10-13 13:57:02

标签: android android-networking

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

现在NetworkOnMainThread异常给了我头痛......该应用程序完美适用于2.3.3,因为没有NetworkOnMainThread异常那样的时间。

经过大量搜索..两种解决方案

  1. 为网络创建新线程或
  2. 的AsyncTask。
  3. 我试过两次都没有任何结果。

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

1 个答案:

答案 0 :(得分:2)

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

我建议使用AsyncTask,因为它可以让您在执行之前将任意数据(例如message参数)发送到后台/网络线程。继续使用RunnableThread将需要额外的机制来同步UI和网络线程的执行,这些挑战由AsyncTask在幕后处理。