Java 即使在使用AsyncTask之后,仍获取NetworkOnMainThread异常
我正在尝试通过TCP套接字将我的android应用程序的文本到语音结果发送到我的电脑。我正在根据需要使用Async实现它 以下是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);
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)