2012-09-03 12 views
6

जब मैं सिम्युलेटर पर परीक्षण, यह काम करता है, लेकिन निम्न कोड के दौरान त्रुटियों फेंक, जब जब मेरे डिवाइस (Galaxy S3) के साथ परीक्षण, यह रखता है:एंड्रॉयड httpclient.execute अपवाद

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

अपवाद:

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) 

उत्तर

15

यह अपवाद NetworkingOnMainThread फेंक दिया गया है, ठीक है, आप यूआई थ्रेड पर नेटवर्क गतिविधि करते हैं। इसमें मुख्य धागे को अवरुद्ध करने की क्षमता है, क्योंकि यह तब तक प्रतीक्षा करता है जब नेटवर्क कनेक्शन फिर से शुरू होने से पहले समाप्त हो जाता है, इस प्रकार धागे को अवरुद्ध कर दिया जाता है।

आपके पास 2 विकल्प हैं।

1 - अपने सभी नेटवर्किंग को एक अलग थ्रेड पर ले जाएं। सबसे आम और आसान समाधान AsyncTask है लेकिन अन्य विकल्प हैं, जैसे Handlers। यह अनुशंसित विकल्प है।

2- आप UI थ्रेड पर नेटवर्किंग की अनुमति देने के लिए नीति बदल सकते हैं।

सिर्फ इस कोड

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

यह विकल्प के बाद से यह सिर्फ अपवाद नजरअंदाज जोड़ने अनुशंसित नहीं है। एक कारण के लिए अपवाद फेंक दिया गया है। मैं पहला विकल्प चुनूंगा। AsyncTask को कार्यान्वित करने के तरीके पर कई ट्यूटोरियल हैं।

शुभकामनाएं

+0

बिल्कुल सही जवाब। मैं दूसरी विधि की सिफारिश नहीं करता। – Infinity

+0

धन्यवाद, मुझे यह समस्या भी मिली, यह सिम्युलेटर में काम करता है क्योंकि एसडीके संस्करण एंड्रॉइड 2.3 है। – John

+0

यह संभव है कि एंड्रॉइड 2.3 में इसकी अनुमति थी। इसके अलावा, अगर यह सही है तो उत्तर को स्वीकार करने पर विचार करें। यह समुदाय की मदद करता है। –

संबंधित मुद्दे