Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inet地址库显示:Java Android Studio应用程序上的主线程错误_Java_Android_Android Studio_Network Programming_Inetaddress - Fatal编程技术网

Inet地址库显示:Java Android Studio应用程序上的主线程错误

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() {

我一直在创建一个关于检查x网站ip的应用程序,我已经导入了:java.net.InetAddress和它将在intelij上运行,但在android studio上,try/catch块捕获了一些错误:android.os.NetworkOnMainThreadException。这就是代码部分:

   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>