0

I'm working on an android app. I want to get a random number from random.org. I used this method during a discord bot but it's not working on android. I set the permission in the AndroidManifest.xml file but still doesn't work. I read that I can use this method on Android so I tried because I didn't wanted to change this. This is my stacktrace:

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;
    }
}
magic
  • 31
  • 5

1 Answers1

0

You shouldn’t use/make any api call on main thread of your application use the method in a thread or an async task to make an api call.

In your case call this c inside the doInBackground() of your AsyncTask and set the values on onPreExecute()

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

   }
}
Rishav Raj
  • 13
  • 1
  • 4