2012-09-03 28 views
6

Khi tôi thử nghiệm trên mô phỏng, nó hoạt động, nhưng khi thử nghiệm với điện thoại của mình (galaxy s3), nó giữ ném lỗi, khi trong đoạn mã sau:android httpclient.execute ngoại lệ

HttpResponse response; 
     response = httpclient.execute(httppost); 

các trường hợp ngoại lệ:

09-03 08:16:49.018: E/AndroidRuntime(24254): java.lang.RuntimeException: Unable to start activity ComponentInfo{sg.dianping/sg.dianping.activity.ItemListActivity}: android.os.NetworkOnMainThreadException 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.access$600(ActivityThread.java:128) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.os.Looper.loop(Looper.java:137) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.main(ActivityThread.java:4517) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at java.lang.reflect.Method.invokeNative(Native Method) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at java.lang.reflect.Method.invoke(Method.java:511) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at dalvik.system.NativeStart.main(Native Method) 
09-03 08:16:49.018: E/AndroidRuntime(24254): Caused by: android.os.NetworkOnMainThreadException 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 

Trả lời

15

Ngoại lệ này NetworkingOnMainThread được ném khi, tốt, bạn thực hiện hoạt động mạng trên chuỗi giao diện người dùng. Nó có khả năng chặn luồng chính, vì nó chờ cho đến khi kết nối mạng kết thúc trước khi tiếp tục, do đó chặn luồng.

Bạn có 2 tùy chọn.

1 - Di chuyển tất cả mạng của bạn sang một chuỗi khác. Giải pháp phổ biến và dễ dàng nhất là AsyncTask Nhưng có các tùy chọn khác, chẳng hạn như Handlers. Đây là tùy chọn được đề nghị.

2- Bạn có thể thay đổi chính sách để cho phép kết nối mạng trên chuỗi giao diện người dùng.

chỉ cần thêm đoạn mã này

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

Tùy chọn này không được khuyến khích vì nó chỉ bỏ qua ngoại lệ. Ngoại lệ được ném cho một lý do. Tôi sẽ chọn tùy chọn đầu tiên. Có rất nhiều hướng dẫn về cách triển khai AsyncTask.

Chúc may mắn

+0

Câu trả lời hoàn hảo. Tôi sẽ không đề nghị phương pháp thứ hai. – Infinity

+0

Cảm ơn bạn, tôi cũng tìm thấy vấn đề này, nó hoạt động trong giả lập bởi vì phiên bản sdk là android 2.3. – John

+0

Có thể trong Android 2.3 nó đã được cho phép. Ngoài ra, vui lòng xem xét chấp nhận câu trả lời nếu đó là câu trả lời đúng. Nó giúp cộng đồng. –