2011-11-22 34 views
5

Tôi đang cố gắng liên lạc với api còn lại để truy xuất tài liệu JSON, nhưng khi tôi chạy ứng dụng trong trình mô phỏng Android của Eclipse, ứng dụng sẽ đóng ngay sau khi nó bắt đầu ("Thật không may TestRest có dừng lại "). Dường như nó đóng lại do cuộc gọi đến phương thức httpClient.execute.android kết nối với json/xml api

Mã cho hoạt động chính là dưới đây:

public class TestRestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    TextView info; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     info = (TextView) findViewById(R.id.debug); 

     String testUri = "http://www.entireweb.com/xmlquery?pz=MYAPIKEY&ip=IP&q=pizza&n=50&format=json"; 
     // print the uri to the screen - (not seen if rest of code runs) 
     info.setText(testUri); 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpContext localContext = new BasicHttpContext(); 
     HttpGet httpget = new HttpGet(testUri); 


     HttpResponse response = null; 
     try { 
      // TODO fails on this line 
      response = httpclient.execute(httpget, localContext); 

      HttpEntity entity = response.getEntity(); 
      if (entity != null) { 
       info.setText("got it"); 
      } 

     } catch (ClientProtocolException e) { 
      // Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
     } 

    } 
} 

Ngoài ra tôi đã bao gồm các điều khoản web trong file manifest của tôi như sau:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="org.john.testRes" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-permission android:name="android.permission.INTERNET" /> 

Không quá quen thuộc với sự phát triển Android và thực sự không biết gì về những gì gây ra vấn đề. Các api tôi đang sử dụng là tốt và trả về tài liệu json dự kiến ​​từ trình duyệt của tôi. AVD tôi đang sử dụng có thể kết nối với Internet trong trình duyệt của nó và tôi đã thử ứng dụng này trên một số AVD khác nhau.

Bất kỳ đề xuất nào về nguyên nhân gây ra sự cố? Cảm ơn.

Edit: thêm lỗi

11-22 18:13:14.221: D/AndroidRuntime(556): Shutting down VM 
11-22 18:13:14.221: W/dalvikvm(556): threadid=1: thread exiting with uncaught exception (group=0x409951f8) 
11-22 18:13:14.251: E/AndroidRuntime(556): FATAL EXCEPTION: main 
11-22 18:13:14.251: E/AndroidRuntime(556): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.john.testRes/org.john.testRes.TestRestActivity}: android.os.NetworkOnMainThreadException 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.Looper.loop(Looper.java:137) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.main(ActivityThread.java:4340) 
11-22 18:13:14.251: E/AndroidRuntime(556): at java.lang.reflect.Method.invokeNative(Native Method) 
11-22 18:13:14.251: E/AndroidRuntime(556): at java.lang.reflect.Method.invoke(Method.java:511) 
11-22 18:13:14.251: E/AndroidRuntime(556): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-22 18:13:14.251: E/AndroidRuntime(556): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-22 18:13:14.251: E/AndroidRuntime(556): at dalvik.system.NativeStart.main(Native Method) 
11-22 18:13:14.251: E/AndroidRuntime(556): Caused by: android.os.NetworkOnMainThreadException 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 
11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
11-22 18:13:14.251: E/AndroidRuntime(556): at org.john.testRes.TestRestActivity.onCreate(TestRestActivity.java:41) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.Activity.performCreate(Activity.java:4465) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
11-22 18:13:14.251: E/AndroidRuntime(556): ... 11 more 
11-22 18:13:48.321: I/Process(556): Sending signal. PID: 556 SIG: 9 
11-22 18:14:01.552: D/AndroidRuntime(597): Shutting down VM 
+0

xin vui lòng thêm stack trace của ngoại lệ mà bạn đã nhận được từ logcat của bạn – Houcine

+1

Đó là hầu như không thể tìm ra mà không cần đăng nhập, nhưng không phân biệt, bạn không nên đang thực hiện cuộc gọi mạng trong chuỗi chính. Xem xét việc sử dụng [AsyncTasks] (http://developer.android.com/reference/android/os/AsyncTask.html). – dmon

+0

Tôi đồng ý với dmon. Bạn sẽ không bao giờ thực hiện cuộc gọi mạng trong chuỗi giao diện người dùng (sự kiện). kiểm tra câu trả lời mà tôi đã đăng ngày hôm nay để làm chủ đề mạng trong asynctasks http://stackoverflow.com/questions/8224993/loading-image-using-asyn-task/8225107#8225107 – rfsk2010

Trả lời

8

Vấn đề là bạn đang cố gắng để làm mạng lưới hoạt động trên thread UI chính. Bạn cần phải làm điều này trên một sợi riêng biệt. Bạn có thể sử dụng số AsyncTask hoặc chỉ một tiêu chuẩn Thread.

Dưới đây là một ví dụ đơn giản:

final Handler handler = new Handler(); 
new Thread(new Runnable() { 

    @Override 
    public void run() { 
      // Do something long running 
      handler.post(new Runnable() { 

       @Override 
       public void run() { 
        // Do something on the UI Thread 
       } 
      }); 
    } 
}).start(); 
+1

Cảm ơn câu trả lời, tôi đã sử dụng AsyncTask. –

Các vấn đề liên quan