java - 使用 InetAddress 时出现 Java/Android 错误
问题描述
我正在尝试在我的 android 应用程序中实现 ping 选项,但是当您尝试时,调试控制台中会显示以下错误:
I/System.out: Sending Ping Request to 127.0.0.1
I/Error starts here: -----------------------------------
W/System.err: android.os.NetworkOnMainThreadException
W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:364)
at libcore.io.ForwardingOs.sendto(ForwardingOs.java:194)
at libcore.io.IoBridge.sendto(IoBridge.java:556)
at java.net.Inet6AddressImpl.icmpEcho(Inet6AddressImpl.java:267)
W/System.err: at java.net.Inet6AddressImpl.isReachable(Inet6AddressImpl.java:208)
at java.net.InetAddress.isReachable(InetAddress.java:525)
at java.net.InetAddress.isReachable(InetAddress.java:480)
at com.h4lfcr3st.androidswissarmy.PingUtility.BtnMakePing(PingUtility.java:36)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
W/System.err: at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
我已经尝试了 intellij 中的代码,它工作得很好,我相信问题在于 android 访问互联网的权限。已经声明:
<uses-permission android:name="android.permission.INTERNET"/>
在清单中。java代码如下:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.*;
import java.net.*;
public class PingUtility extends AppCompatActivity {
private EditText HostToPing, pingResults;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ping_utility);
HostToPing = findViewById(R.id.ETIpHost);
pingResults = findViewById(R.id.ETLogIp);
}
public void BtnMakePing(View view){ //todo corregir
String ipToPing = HostToPing.getText().toString();
try{
Log.i("IpToPing", "----------------"+ ipToPing);
InetAddress geek = InetAddress.getByName(ipToPing);
Toast.makeText(this, "Sending Ping request to " + ipToPing, Toast.LENGTH_SHORT).show();
System.out.println("Sending Ping Request to " + ipToPing);
boolean recheable = geek.isReachable(10000);
pingResults.setText("The host its recheable = " + recheable);
}catch (Exception e){
Log.i("Error starts here" , "-----------------------------------");
e.printStackTrace();
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
}
}
}
对不起我的拼写,我不是以英语为母语的人
解决方案
android 中的网络操作无法在主线程(活动线程)中运行。您应该创建一个子线程来异步调用网络操作并通过回调接收结果。
推荐阅读
- r - 根据 2 列值合并行
- javascript - contenteditable 将焦点移动到行中的位置
- algorithm - O(n.logn) 中的约瑟夫斯置换(去除顺序)
- reactjs - laravel/beyondcode pusher 不使用 react-native 返回不可用状态
- webpack - 如何在 webpack 4 和 babel 7 中使用源映射?
- facebook-graph-api - 我需要如何以及执行哪个请求才能通过此帖子的 id 从帖子中获取用户名?Instagram API
- java - 带有用户输入的幸运号码
- python - (Django) 如何创建一个引用两个模型的验证 mixin?
- python - 我通过 Heroku 部署了我的 Django 服务器,构建成功,但在部署的 URL 上不断出现“应用程序错误”
- python - 为什么找不到版本“GLIBCXX_3.4.28”(/usr/lib/libQt5Widgets.so.5 需要)