【问题标题】:HttpURLConnection on Android [duplicate]Android上的HttpURLConnection [重复]
【发布时间】:2021-08-21 16:22:37
【问题描述】:

我正在开发一个安卓应用程序。我想从 random.org 获取一个随机数。我在不和谐机器人中使用了这种方法,但它不适用于 android。我在 AndroidManifest.xml 文件中设置了权限,但仍然不起作用。我读到我可以在 Android 上使用这种方法,所以我尝试了,因为我不想改变它。 这是我的堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ranker, PID: 2236
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
        at android.view.View.performClick(View.java:8160)
        at android.widget.TextView.performClick(TextView.java:16222)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
        at android.view.View.performClickInternal(View.java:8137)
        at android.view.View.access$3700(View.java:888)
        at android.view.View$PerformClick.run(View.java:30236)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8506)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
        at android.view.View.performClick(View.java:8160) 
        at android.widget.TextView.performClick(TextView.java:16222) 
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967) 
        at android.view.View.performClickInternal(View.java:8137) 
        at android.view.View.access$3700(View.java:888) 
        at android.view.View$PerformClick.run(View.java:30236) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.app.ActivityThread.main(ActivityThread.java:8506) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139) 
     Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1605)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
        at java.net.InetAddress.getAllByName(InetAddress.java:1152)
        at com.android.okhttp.Dns$1.lookup(Dns.java:41)
        at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:178)
        at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144)
        at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:86)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:192)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:211)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:30)
        at com.example.ranker.TrueRandom.getInt(TrueRandom.java:36)
        at com.example.ranker.MainActivity.onButtonClick(MainActivity.java:23)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
        at android.view.View.performClick(View.java:8160) 
        at android.widget.TextView.performClick(TextView.java:16222) 
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967) 
        at android.view.View.performClickInternal(View.java:8137) 
        at android.view.View.access$3700(View.java:888) 
        at android.view.View$PerformClick.run(View.java:30236) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.app.ActivityThread.main(ActivityThread.java:8506) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139) 

onButtonClick:

public void onButtonClick(View v) {
        final TextView text = findViewById(R.id.textView3);
        if (text == null) return;
        final Button button = (Button) v;
        text.setText(String.valueOf(new TrueRandom().getInt()));
    }

TrueRandom.java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Objects;

public class TrueRandom {
    public TrueRandom() {
    }

    public int getInt() {
        URL url = null;
        try {
            url = new URL("https://www.random.org/integers/?num=1&min=-10000&max=10000&col=1&base=10&format=plain&rnd=new");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        final HttpURLConnection connection;

        try {
            connection = (HttpURLConnection) Objects.requireNonNull(url).openConnection();
            connection.setRequestMethod("GET");
        } catch (IOException e) {
            e.printStackTrace();
            return 0;
        }

        connection.setRequestProperty("accept", "text/plain");
        InputStream responseStream = null;
        try {
            responseStream = connection.getInputStream();
        } catch (IOException ignored) {

        }

        if (responseStream == null) return 0;
        final int toReturn=rnd(connection, responseStream);
        connection.disconnect();
        return toReturn;
    }
    private static int rnd(final HttpURLConnection connection, final InputStream responseStream) {
        final BufferedReader in = new BufferedReader(
                new InputStreamReader(responseStream));
        try {
            return Integer.parseInt(in.readLine());
        } catch (Exception ignored) {
        }
        try {
            in.close();
        } catch (IOException ignored) {
        }
       return 0;
    }
}

【问题讨论】:

    标签: java android httpurlconnection


    【解决方案1】:

    您不应在应用程序的主线程上使用/进行任何 api 调用,使用线程或异步任务中的方法进行 api 调用。

    在你的情况下,在 doInBackground() 中调用这个 c 您的 AsyncTask 并在 onPreExecute() 上设置值

    class YourTask extends AsyncTask<Void, Void, Integer>{
       Integer doInBackground(){
         return new TrueRandom().getInt();
       }
       void onPostExecute(Integer result){
          text.setText(String.valueOf(result));
    
       }
    }
    

    【讨论】:

    • AsyncTask 已弃用,使用 kotlin concurrence 或 LoadManager+AsyncTaskLoader
    • 在 AsyncTask 中编写 api 调用或使用 Retrofit 或 Volley 等库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多