[英]Error with socket connection in android
我在android中的tcp連接有問題。 例外是:
03-17 17:39:29.374 1089-1089/com.example.dhorka.client E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.dhorka.client, PID: 1089
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:4007)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4002)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
at java.net.Socket.startupSocket(Socket.java:590)
at java.net.Socket.<init>(Socket.java:226)
at com.example.albert.client.ConnectionManagement.run(ConnectionManagement.java:39)
at java.lang.Thread.run(Thread.java:818)
at com.example.albert.client.MainActivity.click(MainActivity.java:43)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4002)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
03-17 17:39:31.479 1089-1089/com.example.dhorka.client I/Process﹕ Sending signal. PID: 1089 SIG: 9
我不知道這是什么問題。 我使用的代碼是:
public class ConnectionManagement implements Runnable {
private static ConnectionManagement instance = new ConnectionManagement();
private String ip;
private int port;
private Socket connection;
private PrintWriter printWriter;
private ConnectionManagement(){
this.ip = "127.0.0.1";
this.port = 700;
}
public static ConnectionManagement getInstance(){
return instance;
}
public void setIp(String ip){
this.ip=ip;
}
public void setPort(int port){
this.port=port;
}
public void run(){
try {
connection = new Socket(InetAddress.getByName(this.ip), this.port);
PrintWriter printWriter = new PrintWriter(connection.getOutputStream(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessage(String message){
printWriter.write(message);
}
public void disconnect(){
try {
printWriter.flush();
printWriter.close();
connection.close();
}catch (IOException e){
e.printStackTrace();
}
}
public boolean isClosed(){
return connection.isClosed();
}
當我在主要活動中調用此類時,我正在這樣做:
case R.id.connect:
EditText editText = (EditText) findViewById(R.id.ip);
String ip = editText.getText().toString();
connection.setIp(ip);
new Thread(connection).run();
break;
我不知道我在做什么錯。
感謝您的關注。
您嘗試以錯誤的方式啟動線程。 如果要啟動新線程,則應使用start()
方法。 現在,您只需在主線程中調用run()
方法,就可以使用NetworkOnMainThreadException
。
更改:
new Thread(connection).run();
至
new Thread(connection).start();
在R.id.connect
情況下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.