Inet地址库显示:Java Android Studio应用程序上的主线程错误
我一直在创建一个关于检查x网站ip的应用程序,我已经导入了:java.net.InetAddress和它将在intelij上运行,但在android studio上,try/catch块捕获了一些错误:android.os.NetworkOnMainThreadException。这就是代码部分:Inet地址库显示:Java Android Studio应用程序上的主线程错误,java,android,android-studio,network-programming,inetaddress,Java,Android,Android Studio,Network Programming,Inetaddress,我一直在创建一个关于检查x网站ip的应用程序,我已经导入了:java.net.InetAddress和它将在intelij上运行,但在android studio上,try/catch块捕获了一些错误:android.os.NetworkOnMainThreadException。这就是代码部分: AsyncTask.execute(new Runnable() { @Override public void run() {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
InetAddress address = null;
try {
address = InetAddress.getByName(String.valueOf(hostnumber));
} catch (UnknownHostException e) {
e.printStackTrace();
}catch (Exception e) {
Toast.makeText(Lookup.this,"Problem"+e, Toast.LENGTH_SHORT).show();
}
output.setText((CharSequence) address);
}
});
}
});
I've added the internet permission on manifest: <uses-permission android:name="android.permission.INTERNET" />
The try/catch block caught: 'android.os.NetworkOnMainThreadException'
AsyncTask.execute(新的Runnable(){
@凌驾
公开募捐{
submit.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
InetAddress=null;
试一试{
address=InetAddress.getByName(String.valueOf(hostnumber));
}捕获(未知后异常e){
e、 printStackTrace();
}捕获(例外e){
Toast.makeText(Lookup.this,“Problem”+e,Toast.LENGTH_SHORT.show();
}
output.setText((字符序列)地址);
}
});
}
});
我已在清单上添加了internet权限:
try/catch块被捕获:“android.os.NetworkOnMainThreadException”
我从stack中看到了一些答案,例如:
但它仍然不会显示网站的IP地址并再次显示错误。如果您对此问题有任何解决方案,请联系lmk。提前谢谢
更新:我试图放一个布尔语句,但它更糟,抛出了一些错误。这些块的语法可能是错误的格式吗?我应该在哪里修复代码?您遇到了问题,因为在Android中,您只能在主线程中访问视图,并且只能在WorkerThread中访问网络 另外,创建异步任务的方式也不正确 几年前我就完全改用了Kotlin,而且我已经有三年没有编写Java了,不过这应该是可行的:
公共类Testss扩展活动{
静态类结果{
静态类成功扩展了结果{
公共数据;
公众成功(T数据){
这个数据=数据;
}
}
静态类失败扩展了结果{
公众可抛弃错误;
公共故障(可丢弃错误){
this.error=错误;
}
}
}
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
...
submit.setOnClickListener(新视图.OnClickListener(){
AsyncTask任务=新建AsyncTask(){
//注意:此方法在后台线程中运行,您无法从此处访问视图
@凌驾
受保护的结果doInBackground(字符串…主机号){
结果;
试一试{
结果=新的result.Success(InetAddress.getByName(String.valueOf(hostnumber));
}捕获(未知后异常e){
e、 printStackTrace();
结果=新结果。失败(e);
}捕获(例外e){
结果=新结果。失败(e);
}
返回结果;
}
//注意:此方法在主线程中运行
@凌驾
受保护的void onPostExecute(结果){
if(result.Success的结果实例){
output.setText((CharSequence)((Result.Success)Result.data);
}else if(result.Failure的结果实例){
可丢弃错误=((Result.Failure)Result.error
Toast.makeText(Lookup.this,“Problem”+错误,Toast.LENGTH_SHORT.show();
}
}
};
task.execute(主机号);
};
}
}
嗨,我按照安德烈的建议做了这件事,它解决了问题和代码:
EditText hostnumber;
TextView output;
Button submit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lookup);
hostnumber = findViewById(R.id.hostnumber);
output = findViewById(R.id.output);
submit = findViewById(R.id.submit);
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@SuppressLint("StaticFieldLeak") AsyncTask<String, Void, connection.Result<InetAddress>> task = new AsyncTask<String, Void, connection.Result<InetAddress>>() {
// NOTE: this method runs in a background thread, you cannot access the View from here
@Override
protected connection.Result<InetAddress> doInBackground(String... hostnumber) {
connection.Result<InetAddress> result;
try {
result = new connection.Result.Success(InetAddress.getByName(String.valueOf(hostnumber)));
} catch (UnknownHostException e) {
e.printStackTrace();
result = new connection.Result.Failure(e);
}catch (Exception e) {
result = new connection.Result.Failure(e);
}
return result;
}
@Override
protected void onPostExecute(connection.Result<InetAddress> result) {
if (result instanceof connection.Result.Success) {
output.setText((CharSequence) ((connection.Result.Success<InetAddress>) result).data);
} else if (result instanceof connection.Result.Failure) {
Throwable error = ((connection.Result.Failure<InetAddress>) result).error;
Toast.makeText(Lookup.this,"Please Check The Address!: " +error, Toast.LENGTH_SHORT).show();
}
}
};
task.execute(hostnumber.toString());
};
})
;}
}
class connection extends Activity {
static class Result<T> {
static class Success<T> extends Result<T> {
public T data;
public Success(T data) {
this.data = data;
}
}
static class Failure<T> extends Result<T> {
public Throwable error;
public Failure(Throwable error) {
this.error = error;
}
}
}
}
EditText主机号;
文本视图输出;
按钮提交;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u查找);
hostnumber=findviewbyd(R.id.hostnumber);
输出=findviewbyd(R.id.output);
提交=findViewById(R.id.submit);
submit.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
@SuppressLint(“StaticFieldLeak”)AsyncTask任务=新建AsyncTask(){
//注意:此方法在后台线程中运行,您无法从此处访问视图
@凌驾
受保护的连接。结果doInBackground(字符串…主机号){
联系。结果;
试一试{
result=newconnection.result.Success(InetAddress.getByName(String.valueOf(hostnumber));
}捕获(未知后异常e){
e、 printStackTrace();
结果=新连接。结果。故障(e);
}捕获(例外e){
结果=新连接。结果。故障(e);
}
返回结果;
}
@凌驾
受保护的void onPostExecute(connection.Result){
if(connection.result.Success的结果实例){
output.setText((CharSequence)((connection.Result.Success)Result.data);
}else if(connection.result.Failure的结果实例){
可丢弃错误=(
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Lookup">
<EditText
android:id="@+id/hostnumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="98dp"
android:ems="10"
android:inputType="textUri|textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="61dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/hostnumber" />
<TextView
android:id="@+id/output"
android:layout_width="100dp"
android:layout_height="47dp"
android:layout_marginStart="63dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="312dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.186"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/submit" />
</androidx.constraintlayout.widget.ConstraintLayout>