• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Invoking An Api With HttpURLConnection

Hello,

I am trying to invoke an api (or in this example just get the web response from a web server)

Code:
try
{
    URL url = new URL("http://mywebsite.com/");
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

    try
    {
        InputStream in = new BufferedInputStream(urlConnection.getInputStream());
        String theString = convertStreamToString(in);
    } finally {

        urlConnection.disconnect();
     }
}
catch (MalformedURLException e)
{
    e.printStackTrace();
}
catch (Exception ex)
{

    AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
    alertDialog.setTitle(ex.toString());
    alertDialog.setMessage(ex.getMessage());
    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
    alertDialog.show();
}

I keep getting a general exception.
ex.toString() == android.os.NetworkOnMainThreadExectption
ex.getMessage() == ""

Thanks in advance!
 
Thank you for the reply.

I tried to add threads, using the example you gave but I seem to be stuck on an error where the program just crashes . Here is my code.

Code:
public void cmdGo_OnClick(View v)
{
    Button button = (Button) v;
    v.setEnabled(false);

    InputStream is = openHttpConnection("http://www.google.com");

    v.setEnabled(true);
}

private Handler messageHandler = new Handler() {
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        //ImageView img = (ImageView) findViewById(R.id.imageView);
        //img.setImageBitmap((Bitmap) (msg.getData().getParcelable("bitmap")));
        //progressDialog.dismiss();
    }
};

private void downloadImage(String urlStr) {
    //progressDialog = ProgressDialog.show(this, "", "Downloading Image from " + urlStr);
    final String url = urlStr;

    new Thread() {
        public void run() {
            InputStream in = null;

            Message msg = Message.obtain();
            msg.what = 1;

            try {
                in = openHttpConnection(url);
                bitmap = BitmapFactory.decodeStream(in);
                Bundle b = new Bundle();
                b.putParcelable("bitmap", bitmap);
                msg.setData(b);
                in.close();
            }

            catch (IOException e1) {
                e1.printStackTrace();
            }
            //messageHandler.sendMessage(msg);
        }
    }.start();
}



private InputStream openHttpConnection(String urlStr) {
    InputStream in = null;
    int resCode = -1;

    try {
        URL url = new URL(urlStr);
        URLConnection urlConn = url.openConnection();

        if (!(urlConn instanceof HttpURLConnection)) {
            throw new IOException("URL is not an Http URL");
        }
        HttpURLConnection httpConn = (HttpURLConnection) urlConn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();
        resCode = httpConn.getResponseCode();

        if (resCode == HttpURLConnection.HTTP_OK) {
            in = httpConn.getInputStream();
        }
    }

    catch (MalformedURLException e) {
        e.printStackTrace();
    }

    catch (IOException e) {
        e.printStackTrace();
    }
    return in;
}

Code:
Client not ready yet..Waiting for process to come online
Connected to process 5762 on device Nexus_6_API_23 [emulator-5554]
I/Choreographer: Skipped 40 frames!  The application may be doing too much work on its main thread.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: net.myapp.myuser.myfirstandroidapp, PID: 5762
                  java.lang.IllegalStateException: Could not execute method for android:onClick
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                      at android.view.View.performClick(View.java:5198)
                      at android.view.View$PerformClick.run(View.java:21147)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: java.lang.reflect.InvocationTargetException
                      at java.lang.reflect.Method.invoke(Native Method)
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                      at android.view.View.performClick(View.java:5198)
                      at android.view.View$PerformClick.run(View.java:21147)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: android.os.NetworkOnMainThreadException
                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
                      at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
                      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
                      at java.net.InetAddress.getAllByName(InetAddress.java:215)
                      at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
                      at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
                      at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
                      at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
                      at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)
                      at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
                      at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
                      at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
                      at net.myapp.myuser.myfirstandroidapp.MainActivity.openHttpConnection(MainActivity.java:246)
                      at net.myapp.myuser.myfirstandroidapp.MainActivity.cmdLogin_OnClick(MainActivity.java:183)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                      at android.view.View.performClick(View.java:5198)
                      at android.view.View$PerformClick.run(View.java:21147)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
 
You're not using threads properly. Your application is still throwing a NetworkOnMainThreadException

Code:
                   Caused by: android.os.NetworkOnMainThreadException  
                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
                     at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
                      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
                      at java.net.InetAddress.getAllByName(InetAddress.java:215)
 
thank you for the reply, I was not calling the procedure that creates the thread.

Is BlockingQueue the best way to handle data (data for now is just a string) between the threads? It will be a singleton method and I will disable the button immediately after it is clicked so you cannot send multiple requests. How can I get the response (which may take time) from the network thread back to the main UI thread?
 
Last edited:
Back
Top Bottom