2011-11-22 18 views
5

से कनेक्ट करने वाला एंड्रॉइड एक JSON दस्तावेज़ पुनर्प्राप्त करने के लिए एक अतिरिक्त एपीआई के साथ संवाद करने की कोशिश कर रहा है, लेकिन जब मैं ग्रहण एंड्रॉइड एमुलेटर में एप्लिकेशन चलाता हूं तो ऐप शुरू होने पर ही बंद हो जाता है (दुर्भाग्यवश टेस्टरेस्ट में रोका हुआ")। HttpClient.execute विधि पर कॉल के कारण यह बंद हो रहा है।एंड्रॉइड जेसन/एक्सएमएल एपीआई

मुख्य गतिविधि के लिए कोड के नीचे है:

<?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" /> 

नहीं भी एंड्रॉयड विकास और वास्तव में से परिचित:

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 { 
     } 

    } 
} 

इसके अलावा, मैं नीचे के रूप में मेरी मैनिफ़ेस्ट फ़ाइल में वेब अनुमतियों को शामिल किया है समस्या का कारण क्या है इसके बारे में अनजान। मैं जिस एपीआई का उपयोग कर रहा हूं वह ठीक है और मेरे ब्राउज़र से अपेक्षित जेसन दस्तावेज़ लौटाता है। मैं जिस एवीडी का उपयोग कर रहा हूं वह अपने ब्राउज़र में इंटरनेट से कनेक्ट हो सकता है और मैंने कुछ अलग एवीडी पर ऐप की कोशिश की है।

समस्या का कारण क्या है इसके बारे में कोई सुझाव? धन्यवाद।

संपादित करें: जोड़ा त्रुटियों

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

अपवाद है कि आप अपने Logcat – Houcine

+1

यह लॉग के बिना यह पता लगाने की लगभग असंभव है से मिल गया है की स्टैक ट्रेस जोड़ने कृपया, लेकिन परवाह किए बिना, आप नहीं करना चाहिए मुख्य धागे में नेटवर्क कॉल कर रहे हैं। [AsyncTasks] (http://developer.android.com/reference/android/os/AsyncTask.html) का उपयोग करने में देखें। – dmon

+0

मैं डॉन से सहमत हूं। आपको UI (ईवेंट) थ्रेड में कभी भी नेटवर्क कॉल नहीं करना चाहिए। जवाब जो मैं आज तैनात asynctasks http://stackoverflow.com/questions/8224993/loading-image-using-asyn-task/8225107#8225107 – rfsk2010

उत्तर

8

समस्या यह है कि आप मुख्य यूआई धागे पर नेटवर्क संचालन करने के लिए कोशिश कर रहे हैं। आपको इन्हें एक अलग थ्रेड पर करने की ज़रूरत है। आप AsyncTask या केवल मानक Thread का उपयोग कर सकते हैं।

यहाँ एक सरल उदाहरण है:

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

धन्यवाद, मैं AsyncTask का उपयोग कर समाप्त हो गया। –

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