Java 即使在使用AsyncTask之后,仍获取NetworkOnMainThread异常

Java 即使在使用AsyncTask之后,仍获取NetworkOnMainThread异常,java,android,sockets,tcp,Java,Android,Sockets,Tcp,我正在尝试通过TCP套接字将我的android应用程序的文本到语音结果发送到我的电脑。我正在根据需要使用Async实现它 以下是onCreate(): 在收到文本到语音的结果时,我调用execute()方法 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);

我正在尝试通过TCP套接字将我的android应用程序的文本到语音结果发送到我的电脑。我正在根据需要使用Async实现它

以下是
onCreate()

在收到文本到语音的结果时,我调用
execute()
方法

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                txtSpeechInput.setText(result.get(0));
                sender.execute(result.get(0));
            }
            break;
        }

        }
    }

onProgressUpdate
在UI线程中执行。尝试将代码放在
doInBackground
中。

您正在
TCPClient
构造函数中执行网络I/O。将所有这些移动到
doInBackground()
。构造函数应该做的就是将主机和端口号存储在
TCPClient
的字段中,以便您可以在
doInBackground()

中引用它们的值,只有doInBackground是在后台线程上执行的,那么您希望如何?好的。那么我应该在
doInBackground()
中创建套接字吗?如果是,那么如果我输入
doInBackground()
,套接字对象不是每次都会被创建吗?@InsaneCoder:“那么我应该在doInBackground()中创建套接字吗?”--是。“不是每次都会创建套接字对象吗?”--是。由于无法重用
异步任务
,因此每次都需要重新创建
套接字
实例。但我只是第一次通过套接字获取数据。在此之后,只打印日志行“Data sent:”,但不会通过套接字接收任何数据。你能在这方面提供帮助或提供答案吗
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                txtSpeechInput.setText(result.get(0));
                sender.execute(result.get(0));
            }
            break;
        }

        }
    }
public class TCPClient extends AsyncTask<String,String,String>
{
    protected void onPostExecute(String result) {

    }

    protected void onPreExecute1() {}

    protected void onProgressUpdate(Void... values) {}

    PrintWriter out;
    TCPClient(String ip, int port)
    {
        try
        {
            Socket socket = new Socket(ip,port);

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

        }catch (Exception e)
        {
            Log.d("LINUX","Exception while creating socket");
            e.printStackTrace();
        }
    }

    @Override
    protected String doInBackground(String... arg0)
    {
        Log.d("LINUX","Data sent : "+arg0);
        out.println(arg0);
        return "Executed";
    }
}
06-23 01:42:03.651: W/System.err(11990): android.os.NetworkOnMainThreadException
06-23 01:42:03.652: W/System.err(11990):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1161)
06-23 01:42:03.653: W/System.err(11990):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
06-23 01:42:03.653: W/System.err(11990):    at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
06-23 01:42:03.653: W/System.err(11990):    at libcore.io.IoBridge.connect(IoBridge.java:122)
06-23 01:42:03.653: W/System.err(11990):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
06-23 01:42:03.653: W/System.err(11990):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
06-23 01:42:03.653: W/System.err(11990):    at java.net.Socket.startupSocket(Socket.java:590)
06-23 01:42:03.653: W/System.err(11990):    at java.net.Socket.tryAllAddresses(Socket.java:128)
06-23 01:42:03.653: W/System.err(11990):    at java.net.Socket.<init>(Socket.java:178)
06-23 01:42:03.653: W/System.err(11990):    at java.net.Socket.<init>(Socket.java:150)
06-23 01:42:03.654: W/System.err(11990):    at info.androidhive.speechtotext.TCPClient.<init>(TCPClient.java:26)
06-23 01:42:03.654: W/System.err(11990):    at info.androidhive.speechtotext.MainActivity.onCreate(MainActivity.java:28)
06-23 01:42:03.654: W/System.err(11990):    at android.app.Activity.performCreate(Activity.java:6010)
06-23 01:42:03.654: W/System.err(11990):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
06-23 01:42:03.654: W/System.err(11990):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
06-23 01:42:03.654: W/System.err(11990):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
06-23 01:42:03.654: W/System.err(11990):    at android.app.ActivityThread.access$800(ActivityThread.java:155)
06-23 01:42:03.654: W/System.err(11990):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
06-23 01:42:03.654: W/System.err(11990):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-23 01:42:03.654: W/System.err(11990):    at android.os.Looper.loop(Looper.java:135)
06-23 01:42:03.654: W/System.err(11990):    at android.app.ActivityThread.main(ActivityThread.java:5343)
06-23 01:42:03.654: W/System.err(11990):    at java.lang.reflect.Method.invoke(Native Method)
06-23 01:42:03.654: W/System.err(11990):    at java.lang.reflect.Method.invoke(Method.java:372)
06-23 01:42:03.654: W/System.err(11990):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
06-23 01:42:03.654: W/System.err(11990):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)