我正在尝试通过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)
答案 0 :(得分:1)
您正在TCPClient
构造函数中进行网络I / O.将所有内容移至doInBackground()
。所有构造函数应该做的是将主机和端口号存储在TCPClient
的字段中,以便您可以在doInBackground()
中引用它们的值。
答案 1 :(得分:0)
onProgressUpdate
在UI线程中执行。请尝试将代码放在doInBackground
中。