0

谢谢我通过在按钮上使用切换值让它工作

public void onClick(View v) {
                               // TODO Auto-generated method stub

                             doit=1;
                             Log.e("ErrorButton","NextTime "+doit);
                           }
                       });  
                      if(doit==1)
                      {
                          Log.e("ErrorButton","If");
                      ////
                          out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); 
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));                

                        out.println("Helloo");

                        while ((text = in.readLine()) != null) {
                            finall += text;
                            Log.e("Test","Final: "+finall);
                          if(text=="quit")
                          {
                              socket.close();
                          }
                      Log.e("ClientActivity", "After Read "+doit+" "+finall);
                     // in.close();

                       doit=0;
                       Log.e("ClientActivity", "After If "+doit);
                      } 

每当我单击按钮时,代码都会执行其任务然后崩溃

这是我的安卓代码:

package com.example.socketclient;


import android.R.string;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream;
import java.io.OutputStreamWriter; 
import java.io.InputStreamReader;
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import android.util.Log; 

public class SocketCode extends Activity {
    private boolean connected = false;
    //private Handler handler = new Handler();
    public TextView txt;
    protected SocketCore Conn;
    public Button b;
    public EditText TextToSend;
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_socket_code);
        b = (Button)findViewById(R.id.button1);
        txt = (TextView)findViewById(R.id.textView1);
        TextToSend = (EditText)findViewById(R.id.editText1);
        //Conn = new SocketCore(this,txt);

        Thread cThread = new Thread(new ClientThread());
        cThread.start();

    }
    public class ClientThread implements Runnable {
        Socket socket ;
String finall;
        public void run() {
            try {
                InetAddress serverAddr = InetAddress.getByName("192.168.0.150");
                Log.d("ClientActivity", "C: Connecting...");
                socket= new Socket(serverAddr,4444);
                connected = true;
                while (connected) {
                    try {
                        Log.d("ClientActivity", "C: Sending command.");

                       b.setOnClickListener(new View.OnClickListener() {

                           public void onClick(View v) {
                               // TODO Auto-generated method stub

                               ClientHandler("Hex");

                           }
                       });  




                            Log.d("ClientActivity", "C: Sent.");


                    } catch (Exception e) {
                        Log.e("ClientActivity", "S: Error", e);
                    }
                    Thread.sleep(2000);
                }
                socket.close();
                txt.setText("Closed Socket");
                Log.d("ClientActivity", "C: Closed.");
            } catch (Exception e) {
                Log.e("ClientActivity", "C: Error", e);
                connected = false;
            }
        }

        public void ClientHandler(String Send)
        {
            try{
              PrintWriter   out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                       .getOutputStream())), true);
          out.println(Send);
           BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
           finall = in.readLine();

           txt.setText(finall);
            }
            catch(IOException e)
            {txt.setText("Exception");}
        }


    }

}

这是错误日志:

11-24 23:44:12.920: E/AndroidRuntime(10046): FATAL EXCEPTION: main
11-24 23:44:12.920: E/AndroidRuntime(10046): android.os.NetworkOnMainThreadException
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.io.InputStreamReader.read(InputStreamReader.java:244)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.io.BufferedReader.readLine(BufferedReader.java:354)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.example.socketclient.SocketCode$ClientThread.ClientHandler(SocketCode.java:103)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.example.socketclient.SocketCode$ClientThread$1.onClick(SocketCode.java:66)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.view.View.performClick(View.java:4211)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.view.View$PerformClick.run(View.java:17267)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.Handler.handleCallback(Handler.java:615)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.Looper.loop(Looper.java:137)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.app.ActivityThread.main(ActivityThread.java:4898)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.lang.reflect.Method.invokeNative(Native Method)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.lang.reflect.Method.invoke(Method.java:511)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at dalvik.system.NativeStart.main(Native Method)

注意:服务器端接受连接没有问题也接受来自客户端的数据,然后再崩溃

4

4 回答 4

1

据此。_ 当应用程序尝试在其主线程上执行网络操作时引发的异常。

问题是这条线

PrintWriter   out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                   .getOutputStream())), true);

当你做b.setOnClickListener你的View.OnClickListener(),因此ClientHandler由 UI 线程而不是生成的线程执行。稍后的 UI 线程尝试执行上述操作,其中包含socket.getOutputStream()异常

这主要是因为,像许多其他工具包一样,Android 工具包不是线程安全的。UI Thread执行所有UI操作。网络操作通常具有与之相关的延迟。如果 Ui 线程忙于网络,它如何在屏幕上呈现任何内容?

于 2012-11-24T21:55:48.227 回答
1

更改此部分并添加 runOnUiThread:

runOnUiThread(new Runnable() 
{
    public void run() 
    {
        b.setOnClickListener(new View.OnClickListener() {...});
        // and also Logs
    }
});
于 2012-11-24T22:06:15.830 回答
0

看看这个http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html。根据官方文档,如果您使用 Honeycomb SDK 或更高版本,则不应将网络操作放在主/UI 线程上。允许针对早期 SDK 版本的应用程序在其主事件循环线程上进行联网,但强烈建议不要这样做,因为它会阻塞 UI 并可能导致 ANR。

您需要使用后台线程或AsyncTask进行网络操作以避免出现此异常。

作为一般规则,总是将耗时的任务放在后台线程或AsyncTask.

于 2012-11-24T21:51:54.893 回答
0

严格模式是用于检测 UI 线程中某些操作的开发者工具。阅读此内容以获取详细信息http://developer.android.com/reference/android/os/StrictMode.html

从 Android 版本 3.0 开始,默认启用严格模式。

于 2012-11-24T21:58:06.107 回答