Question

So I get an android.os.NetworkOnMainThreadException, and I can't seem to find what is wrong. I have searched up on it, and most people seem to get it because they are trying to access the network on the main thread. I create the "AsyncTask" to make a different thread and have it run in the background, so unless I'm doing it incorrectly, I am not sure what all I can change.

package rafa.weatherapp;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.TextView;


public class MainActivity extends Activity

{

    TextView http;
/** Called when the activity is first created. 
 * @param runnable */

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);         
        http = (TextView) findViewById(R.id.http_display);

        GetHttp yes = new GetHttp();

        http.setText(yes.doInBackground());



        //connect.execute();


    }


    private class GetHttp extends AsyncTask<Object, Void, String>
    {
        @Override
        protected String doInBackground(Object... arg0) {
            int responseCode= -1;
            int identity = 0;
            try{
                //define URL that information will come in from
                URL url = new URL("http://openweathermap.org/data/2.3/forecast/city?id=524901&APPID=111111111");
                //establish HttpURL Connection
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();

                //check to make sure it connected
                responseCode=connection.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK);

                //Take in the data 
                InputStream in = connection.getInputStream();
                Reader reader = new InputStreamReader(in);
                int contentLength = connection.getContentLength();          
                char charArray[] = new char[contentLength];

                reader.read(charArray);
                String responseData = new String(charArray);

                Log.v(responseData, null);





            }
            catch(IOException e ){
                return "Unable to retrieve webpage, URL may be invalid";
            }


            return null;

        }

    };
}

My error is below:

04-30 15:33:02.371: W/dalvikvm(17021): threadid=1: thread exiting with uncaught exception (group=0x4206d700)
04-30 15:33:02.376: E/AndroidRuntime(17021): FATAL EXCEPTION: main
04-30 15:33:02.376: E/AndroidRuntime(17021): java.lang.RuntimeException: Unable to start activity ComponentInfo{rafa.weatherapp/rafa.weatherapp.MainActivity}: android.os.NetworkOnMainThreadException
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.ActivityThread.access$700(ActivityThread.java:168)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.os.Looper.loop(Looper.java:137)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.ActivityThread.main(ActivityThread.java:5493)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at java.lang.reflect.Method.invokeNative(Native Method)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at java.lang.reflect.Method.invoke(Method.java:525)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at dalvik.system.NativeStart.main(Native Method)
04-30 15:33:02.376: E/AndroidRuntime(17021): Caused by: android.os.NetworkOnMainThreadException
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1144)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at rafa.weatherapp.MainActivity$GetHttp.doInBackground(MainActivity.java:58)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at rafa.weatherapp.MainActivity.onCreate(MainActivity.java:36)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.Activity.performCreate(Activity.java:5372)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
04-30 15:33:02.376: E/AndroidRuntime(17021):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
04-30 15:33:02.376: E/AndroidRuntime(17021):    ... 11 more
04-30 15:38:02.746: I/Process(17021): Sending signal. PID: 17021 SIG: 9
Was it helpful?

Solution

Do not call doInBackground() yourself. Instead execute() the AsyncTask. The framework calls doInBackground() for you on a background thread. Use the result to update your UI in onPostExecute().

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top