即使在使用AsyncTask之后也获得NetworkOnMainThread异常

时间:2016-06-22 20:09:34

标签: java android sockets tcp

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

这里是onCreate()

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sender = new TCPClient("192.168.0.7",2016);
}

收到文本到语音结果后,我调用了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;
        }

        }
    }

这是我的TCPClient类:

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";
    }
}

但我仍然得到NetworkOnMainThreadException。任何人都可以帮助我。

这是stackTrace:

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)

2 个答案:

答案 0 :(得分:1)

您正在TCPClient构造函数中进行网络I / O.将所有内容移至doInBackground()。所有构造函数应该做的是将主机和端口号存储在TCPClient的字段中,以便您可以在doInBackground()中引用它们的值。

答案 1 :(得分:0)

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