我正在尝试使用ModBus协议连接到PLC。我从线程调用ModBus连接方法,我得到例外,我正在主线程上运行通信... 我想知道它逃脱的地方......
例外:
08-02 10:48:44.461: W/System.err(4395): android.os.NetworkOnMainThreadException
08-02 10:48:44.471: W/System.err(4395): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
08-02 10:48:44.471: W/System.err(4395): at
代码:
package com.kikudjiro.android.echo;
import net.wimpi.modbus.facade.ModbusTCPMaster;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class settings extends Activity implements Runnable {
Button connect_b, disconnect_b;
Thread comm = new Thread(this);
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
addListenerOnButton();
}
public void addListenerOnButton() {
connect_b = (Button) findViewById(R.id.button1);
disconnect_b = (Button) findViewById(R.id.button2);
connect_b.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
comm.run();
}
});
disconnect_b.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
comm.interrupt();
}
});
}
// @Override
public void run() {
try {
ModbusTCPMaster MB = new ModbusTCPMaster("192.168.107.29", 502);
//while (!comm.interrupted()) {
Log.i("!!!!!!!", "try!");
MB.connect();
MB.writeCoil(1, 1, true);
MB.disconnect();
//}
}
catch (Exception ex) {
ex.printStackTrace();
Log.i("hhh", "exceptionas!!!");
} finally {
Log.i("!!!!!!!", "finally!");
}
}
}
答案 0 :(得分:0)
单击按钮,可以调用comm.run()
,它只是直接在UI线程的上下文中执行run()
方法。这是一个常见错误,您不应该直接在run()
实例上调用Thread
。使用comm.start()
在工作线程的上下文中执行Modbus代码。