2016-01-23 10 views
6

मैं अपने एंड्रॉइड ऐप को एपीआई के माध्यम से अपने सर्वर से कनेक्ट करने के लिए Okhttp लाइब्रेरी का उपयोग करने का प्रयास कर रहा हूं।एंड्रॉइड Okhttp asynchronous कॉल

मेरा एपीआई कॉल बटन क्लिक पर हो रहा है और मुझे निम्नलिखित android.os.NetworkOnMainThreadException प्राप्त हो रहा है। मैं समझता हूं कि यह तथ्य है कि मैं मुख्य धागे पर नेटवर्क कॉल का प्रयास कर रहा हूं लेकिन मैं एंड्रॉइड पर एक साफ समाधान खोजने के लिए भी संघर्ष कर रहा हूं कि इस कोड को एक और थ्रेड (एसिंक कॉल) का उपयोग कैसे किया जाए।

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     //if login button is clicked 
     case R.id.btLogin: 
      try { 
       String getResponse = doGetRequest("http://myurl/api/"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      break; 
    } 
} 

String doGetRequest(String url) throws IOException{ 
    Request request = new Request.Builder() 
      .url(url) 
      .build(); 

    Response response = client.newCall(request).execute(); 
    return response.body().string(); 

} 

ऊपर मेरी कोड है, और अपवाद लाइन

Response response = client.newCall(request).execute(); 

Ive भी पढ़ा है कि Okhhtp Async अनुरोध का समर्थन करता है, लेकिन मैं वास्तव में अधिकांश के रूप में एंड्रॉयड के लिए एक साफ समाधान नहीं मिल सकता है पर फेंक दिया जा रहा है AsyncTask <> का उपयोग करने वाली एक नई कक्षा का उपयोग करने लगते हैं ??

कोई मदद या सुझाव बहुत सराहना कर रहे हैं, thankyou ...

उत्तर

16

एक अतुल्यकालिक अनुरोध भेजने के लिए, इस का उपयोग करें:

case R.id.btLogin: 
    try { 
     doGetRequest("http://myurl/api/"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    break; 
+0

है:

void doGetRequest(String url) throws IOException{ Request request = new Request.Builder() .url(url) .build(); client.newCall(request) .enqueue(new Callback() { @Override public void onFailure(final Call call, IOException e) { // Error runOnUiThread(new Runnable() { @Override public void run() { // For the example, you can show an error dialog or a toast // on the main UI thread } }); } @Override public void onResponse(Call call, final Response response) throws IOException { String res = response.body().string(); // Do something with the response } }); } 

& यह इस तरह से फोन {try {...} पकड़ने की आवश्यकता नहीं है (IOException e) {...} 'और निश्चित रूप से' doGetRequest (स्ट्रिंग यूआरएल) IOException को फेंकता है {' –

+0

@ वी। कल्याज़हनीयू कोशिश करें .. पकड़ फेंकने वाली त्रुटि को संभालेगा y 'doGetRequest'' IOException' – kirtan403

+0

धन्यवाद। आप सही हैं –

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