2

I'm trying to use the following code to get the http request. The url is:

String url = "http://vlm1.uta.edu/~zhangzhong/questions.json";

When calling InputStream source = retrieveStream(url), it gives me an error. By the way, I've already added <uses-permission android:name="android.permission.INTERNET"/>

   private InputStream retrieveStream(String url) {

        DefaultHttpClient client = new DefaultHttpClient(); 

        HttpGet getRequest = new HttpGet(url);

        try {

           HttpResponse getResponse = client.execute(getRequest);
           final int statusCode = getResponse.getStatusLine().getStatusCode();

           if (statusCode != HttpStatus.SC_OK) { 
              Log.w(getClass().getSimpleName(), "Error " + statusCode + " for URL " + url); 
              return null;
           }

           HttpEntity getResponseEntity = getResponse.getEntity();
           return getResponseEntity.getContent();

        } 
        catch (IOException e) {
           getRequest.abort();
           Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
        }

        return null;   
     }

The following is the LogCat:

04-22 16:36:37.042: D/dalvikvm(3840): Debugger has detached; object registry had 427

entries
04-22 16:36:37.042: I/dalvikvm(3840): ignoring registerObject request in thread=1
04-22 16:36:37.042: I/dalvikvm(3840): ignoring registerObject request in thread=1
04-22 16:36:37.042: D/AndroidRuntime(3840): Shutting down VM
04-22 16:36:37.042: W/dalvikvm(3840): threadid=1: thread exiting with uncaught exception (group=0x41760930)
04-22 16:36:37.072: E/AndroidRuntime(3840): FATAL EXCEPTION: main
04-22 16:36:37.072: E/AndroidRuntime(3840): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.flashcard/com.example.flashcard.MainActivity}: android.os.NetworkOnMainThreadException
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.os.Looper.loop(Looper.java:137)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at java.lang.reflect.Method.invokeNative(Native Method)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at java.lang.reflect.Method.invoke(Method.java:511)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at dalvik.system.NativeStart.main(Native Method)
04-22 16:36:37.072: E/AndroidRuntime(3840): Caused by: android.os.NetworkOnMainThreadException
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at com.example.flashcard.MainActivity.retrieveStream(MainActivity.java:63)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at com.example.flashcard.MainActivity.onCreate(MainActivity.java:37)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.Activity.performCreate(Activity.java:5104)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-22 16:36:37.072: E/AndroidRuntime(3840):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-22 16:36:37.072: E/AndroidRuntime(3840):     ... 11 more
04-22 16:36:37.092: I/Process(3840): Sending signal. PID: 3840 SIG: 9
04-22 16:37:37.727: D/AndroidRuntime(3957): Shutting down VM
04-22 16:37:43.443: D/AndroidRuntime(4077): Shutting down VM
04-22 16:37:43.443: W/dalvikvm(4077): threadid=1: thread exiting with uncaught exception (group=0x41760930)
04-22 16:37:43.443: E/AndroidRuntime(4077): FATAL EXCEPTION: main
04-22 16:37:43.443: E/AndroidRuntime(4077): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.flashcard/com.example.flashcard.MainActivity}: android.os.NetworkOnMainThreadException
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.os.Looper.loop(Looper.java:137)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at java.lang.reflect.Method.invokeNative(Native Method)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at java.lang.reflect.Method.invoke(Method.java:511)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at dalvik.system.NativeStart.main(Native Method)
04-22 16:37:43.443: E/AndroidRuntime(4077): Caused by: android.os.NetworkOnMainThreadException
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at com.example.flashcard.MainActivity.retrieveStream(MainActivity.java:63)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at com.example.flashcard.MainActivity.onCreate(MainActivity.java:37)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.Activity.performCreate(Activity.java:5104)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-22 16:37:43.443: E/AndroidRuntime(4077):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-22 16:37:43.443: E/AndroidRuntime(4077):     ... 11 more
04-22 16:37:44.865: I/Process(4077): Sending signal. PID: 4077 SIG: 9
Fihop
  • 3,127
  • 9
  • 42
  • 65

1 Answers1

0

What is happening here is common, you are trying to perform some long running operation on the main thread of your application.

What that means, is that the main thread is in charge of updating the UI, to enforce a smooth experience, if android detects you are doing some long running operation that is going to be blocking, it will force shutdown the app, to let you know that this is bad.

There are many alternative solution, such as AsynTask, or IntentService.

IntentService is a service that runs when you sent a intent to it:

public class NetworkHandler extends IntentService {
    @Override
    protected void onHandleIntent(Intent intent) {
         //Do your request here
    }
}

To activate the IntentService, simply do:

Intent intent = new Intent(mContext, NetworkHandler.class);
startService(intent);
wangyif2
  • 2,843
  • 2
  • 24
  • 29
  • I've added the NetworkHandler class and tried to activate the `IntentService` in the main activity's `on Create` method. Nothing happens. Do I do something wrong? – Fihop Apr 23 '13 at 00:05