2016-01-23 15 views
6

Próbuję użyć biblioteki Okhttp do podłączenia mojej aplikacji na Androida do mojego serwera za pośrednictwem interfejsu API.Wywołania asynchroniczne Android Okhttp

Moje wywołanie api dzieje się na kliknięcie przycisku i otrzymuję następujący android.os.NetworkOnMainThreadException. Rozumiem, że jest to spowodowane faktem, że próbuję wywoływać połączenia sieciowe w głównym wątku, ale ja także staram się znaleźć czyste rozwiązanie na Androidzie, jak sprawić, by ten kod korzystał z innego wątku (wywołania asynchroniczne).

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

} 

Powyżej jest mój kod, a wyjątek jest rzucony na linii

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

Ive przeczytać również, że Okhhtp obsługuje żądania ASYNC ale naprawdę nie mogę znaleźć czyste rozwiązanie dla Androida jak najbardziej wydaje się używać nowej klasy, która używa AsyncTask <>?

Każda pomoc lub sugestie są mile widziane, Dziękuje ...

Odpowiedz

16

Aby wysłać asynchronicznego żądania, użyj tego:

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

& nazwać to w ten sposób:

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

Istnieje nie ma potrzeby w 'try {...} catch (IOException e) {...}' i oczywiście 'doGetRequest (String url) wyrzuca IOException {' –

+0

@ V.Kalyuzhnyu Spróbuj ... catch obsłuży błąd rzucony b y '' DoGetRequest'' 'IOException' – kirtan403

+0

Dzięki. Masz rację: –

Powiązane problemy