-1

i'm new in Android programming. I want to read data out of a simple json. I have checked dozen of threads with answers which worked for some people. But i'm always getting a fatal error. can someone help? The JSON is from twitter.

code:

    public class MainActivity extends Activity {
    /** Called when the activity is first created. */

    InputStream inputStream = null;
    String result = ""; 

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       String url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
       this.connectToService(url);
}

    public JSONObject connectToService(String url) {

        try {

            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);

            HttpParams httpParameters = httpGet.getParams();
            // Set the timeout in milliseconds until a connection is established.
            int timeoutConnection = 7500;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT) 
            // in milliseconds which is the timeout for waiting for data.
            int timeoutSocket = 7500;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

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

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();

            String jsonString = sb.toString();
            Log.e("WetterTAR", "JSON string returned is"+jsonString.toString());

            JSONObject jsonObject = new JSONObject(jsonString);
            return jsonObject;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (SocketTimeoutException e) {
            e.printStackTrace();
        } catch (ConnectTimeoutException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

          return null;
    }
}

and here the error message:

    01-15 09:42:47.609: D/AndroidRuntime(3095): Shutting down VM
01-15 09:42:47.613: W/dalvikvm(3095): threadid=1: thread exiting with uncaught exception (group=0xa4ba8648)
01-15 09:42:47.637: E/AndroidRuntime(3095): FATAL EXCEPTION: main
01-15 09:42:47.637: E/AndroidRuntime(3095): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wettertar/com.example.wettertar.MainActivity}: android.os.NetworkOnMainThreadException
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.os.Looper.loop(Looper.java:137)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.ActivityThread.main(ActivityThread.java:5103)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at java.lang.reflect.Method.invokeNative(Native Method)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at java.lang.reflect.Method.invoke(Method.java:525)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at dalvik.system.NativeStart.main(Native Method)
01-15 09:42:47.637: E/AndroidRuntime(3095): Caused by: android.os.NetworkOnMainThreadException
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at com.example.wettertar.MainActivity.connectToService(MainActivity.java:56)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at com.example.wettertar.MainActivity.onCreate(MainActivity.java:37)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.Activity.performCreate(Activity.java:5133)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-15 09:42:47.637: E/AndroidRuntime(3095):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
01-15 09:42:47.637: E/AndroidRuntime(3095):     ... 11 more

It should log something, but the programm doesnt even start.

Mike_NotGuilty
  • 2,171
  • 5
  • 27
  • 62

4 Answers4

3

You should not run long running network activities in main thread. Use AsycTask or Runnable to perform the task

Naresh
  • 3,134
  • 1
  • 16
  • 22
  • 1
    More than you "should not", you just can't do it ! That's why you're getting error, network requests have to be run in an AsyncTask ! – Damien R. Jan 15 '14 at 09:48
1

don't use network activities in main thread.This exception only thrown for applications targeting the Honeycomb SDK or higher. perform all the network related task in separate thread . your problem will get solved.

Use Aync Task

class classname extends AsyncTask<String, Void, Void> {

    private Exception exception;

    protected void doInBackground(String... urls) {
        try {
            URL url= new URL(urls[0]);
            // do network req here
        } catch (Exception e) {
            this.exception = e;
            return null;
        }
    }

    protected void onPostExecute() {

    }
}
  • what should i return in this case? i copied all the code where you put the comment. but because this is a void method, i cant return anything. but my method returns a JSONObject – Mike_NotGuilty Jan 15 '14 at 10:14
1

you can do like this:

new Thread(new Runnable() {

            @Override
            public void run() {
                connectToService (url);

            }
        }).start();

or use Asyntask

Ravind Maurya
  • 2,609
  • 1
  • 20
  • 27
1

The key is in the error message:

Caused by: android.os.NetworkOnMainThreadException

From the docs:

A NetworkOnMainThreadException is thrown when an application attempts to perform a networking operation on its main thread. This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.

What is happening is you are performing Network operation on Main thread, which is forbidden by current thread policy. It's not a good idea to do long operations on main thread, instead use, as suggested already by others, separate threads (AsyncTask, Runnables, etc).

See here and here for more info.

Melquiades
  • 8,466
  • 1
  • 29
  • 43