Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix NetworkonMainThreadException in Android? [duplicate]

I'm creating an project for assignment, I'm new to Android, and I wanted to access json from very common url http://api.androidhive.info/contacts/,

Problem: I'm trying to read the url and fetch and parse the json returned by this url,

I've already added following line into my AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

Preferences: and my android preferences are

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
  1. Api level 18
  2. Android 4.3

and this is how I'm trying to read the url

static InputStream is = null;

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

The Error Message

11-02 05:23:47.843: E/AndroidRuntime(2207): FATAL EXCEPTION: main
11-02 05:23:47.843: E/AndroidRuntime(2207): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me.countrypedia/com.me.countrypedia.MainActivity}: android.os.NetworkOnMainThreadException
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)

Also I'm following this tutorial for ListView Example http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

like image 644
zzlalani Avatar asked Nov 02 '13 09:11

zzlalani


2 Answers

Your Exception actually tells you exactly what you are doing wrong. You are not using another thread to perform NetworkOperations. Instead, you perform the network operation on your UI-Thread, which cannot (does not) work on Android.

Your code that connects to the url should be executed for example inside an AsyncTasks doInBackground() method, off the UI-Thread.

Take a look at this question on how to use the AsyncTask: How to use AsyncTask

like image 160
Philipp Jahoda Avatar answered Sep 22 '22 13:09

Philipp Jahoda


Updated Answer:

Potentially long running operations such as network operations should be done in a worker thread.

The most effective way to create a worker thread for longer operations is with the AsyncTask class. Simply extend AsyncTask and implement the doInBackground() method to perform the work.

Many libraries are available to do network operations such as Volley, retrofit etc.


Old Answer:

Add following lines in your activity onCreate method

StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
like image 30
Giru Bhai Avatar answered Sep 18 '22 13:09

Giru Bhai