如何在 Android API 中 Socket/Thread 25

How to Socket/Thread in Android API 25

我在 API 25 中遇到套接字和线程问题。我在 Nexus 6p 上直接针对 API 25 和 7.1.1

当尝试在端口 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() 时,我从未看到 "Was the thread started?"。 logcat 中也没有抛出任何错误。但是当我更改为 运行() 时,我收到 networkonmainthreadexception 错误。它接缝好像改变了什么。我已验证到我的节点服务器的 tcp 连接显示使用节点客户端。

当你得到 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?

希望对您有所帮助!

当应用程序试图在主线程中执行网络操作时抛出此异常。在您的 onViewCreated 中使用以下代码来避免此错误,否则请使用 AsynkTask 进行网络调用。

  if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }