2016-01-23 23 views
6

Tôi đang cố gắng sử dụng thư viện Okhttp để kết nối ứng dụng Android của mình với máy chủ thông qua API.Các cuộc gọi không đồng bộ của Android Okhttp

Cuộc gọi api của tôi đang diễn ra khi nhấp vào nút và tôi nhận được android.os.NetworkOnMainThreadException sau. Tôi hiểu rằng điều này là do thực tế tôi đang cố gắng các cuộc gọi mạng trên các chủ đề chính nhưng tôi cũng đang đấu tranh để tìm một giải pháp sạch trên android như thế nào làm cho mã này sử dụng một thread (gọi async).

@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(); 

} 

Trên đây là mã của tôi, và các ngoại lệ được ném trên dòng

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

Ive cũng đọc mà Okhhtp hỗ trợ các yêu cầu async nhưng tôi thực sự không thể tìm thấy một giải pháp sạch cho android như hầu hết dường như sử dụng một lớp học mới sử dụng AsyncTask <> ??

Bất kỳ sự giúp đỡ hoặc gợi ý được nhiều đánh giá cao, thankyou ...

Trả lời

16

Để gửi một yêu cầu không đồng bộ, sử dụng này:

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 
       } 
      }); 
} 

& gọi nó theo cách này:

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

Có không cần trong 'try {...} catch (IOException e) {...}' và dĩ nhiên 'doGetRequest (String url) ném IOException {' –

+0

@ V.Kalyuzhnyu Hãy thử .. catch sẽ xử lý lỗi được ném b y 'IOException' của' doGetRequest' – kirtan403

+0

Cảm ơn. Bạn là đúng –

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