我在API 25中遇到套接字和线程问题。我直接针对带有7.1.1的Nexus 6p上的API 25
当尝试在端口8124上与我的节点服务器通信时,我初始化一个新线程并初始化一个套接字,但我得到一个networkonmainthreadexception
public class MainActivity extends AppCompatActivity {
private Socket socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Button LoginButton = (Button) findViewById(R.id.button2);
LoginButton.setOnClickListener(
new View.OnClickListener(){
@Override
public void onClick(View v){
TryLogin(v);
}
}
);
}
public void TryLogin(View v){
new Thread(new Runnable() {
@Override
public void run() {
try {
socket = new Socket("192.168.1.57", 8124);
Log.i("SOCKET", "Was the thread started?");
} catch(UnknownHostException e1){
} catch (IOException e1){
}
}
}).start();
}
}
当我调用start()时,我从未看到"线程是否已启动?"。在logcat中都没有抛出任何错误。但是当我改为run()时,我得到networkonmainthreadexception错误。它接缝好像发生了变化。我已经验证了使用节点客户端显示到我的节点服务器的tcp连接。
答案 0 :(得分:1)
当应用程序尝试在主线程中执行网络操作时,抛出此异常。在onViewCreated
中使用以下代码以避免此错误,否则请使用AsynkTask进行网络呼叫。
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
答案 1 :(得分:0)
当你获得networkonmainthreadexception时,这意味着你的线程已经正确启动,并且你的Log.i没有被打印出去的唯一原因是因为在打印之前抛出了错误。将你的Log.i移动到这样的套接字代码上方,你就会看到它被打印出来了:
Log.i("SOCKET", "Was the thread started?");
socket = new Socket("192.168.1.57", 8124);
现在知道你的线程正确启动了,你可以专注于主要问题,即networkmainthreadexception。
幸运的是,问题的答案在于:How to fix android.os.NetworkOnMainThreadException?
希望这有帮助!