如何在 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);
}
我在 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);
}