使用aar包中的线程连接socket,无法连接出现E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.test_differ_kalman, PID: 12202 android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1571) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436) at java.net.Socket.connect(Socket.java:621) at com.example.poslib.PosLib.startThread(PosLib.java:192) at com.example.test_differ_kalman.MyFragment$1.onClick(MyFragment.java:48)
时间: 2024-04-11 20:29:19 浏览: 273
android-gif-drawable-master.zip_android_android gif_site:www.pud
根据您提供的错误日志,可以看到同样出现了 `android.os.NetworkOnMainThreadException` 异常。这个异常说明您的网络连接操作仍然在主线程中执行,而不是在后台线程中。
这可能是由于您的 `PosLib` 类的 `startThread()` 方法内部执行了网络连接操作,导致出现异常。在这种情况下,您需要确保在调用该方法之前,将其放在后台线程中执行。
如果 `PosLib` 类是一个第三方提供的库或者 AAR 包,并且其内部无法更改以在后台线程中执行网络连接操作,那么您可以考虑使用 `AsyncTask` 或者 `Executor` 等方式来将调用代码包装在后台线程中。
以下是使用 `AsyncTask` 的示例代码:
```java
private class ConnectTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(mServerIp, mServerPort));
// 在这里执行与基站的通信操作
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
// 在点击事件处理方法中调用 AsyncTask
new ConnectTask().execute();
```
请将您的网络连接代码放在上述示例中的注释部分进行替换,并确保在点击事件处理方法 `MyFragment$1.onClick()` 中调用 `ConnectTask` 的实例。
通过使用 `AsyncTask`,您可以在后台线程中执行网络连接操作,避免 `NetworkOnMainThreadException` 异常,并确保应用的稳定性和响应性。
阅读全文