2016-01-23 20 views
6

Ich versuche, die Okhttp-Bibliothek zu verwenden, um meine Android-App über API mit meinem Server zu verbinden.Android Okhttp asynchrone Anrufe

Mein api Anruf geschieht auf eine Schaltfläche klicken und erhalte ich die folgende android.os.NetworkOnMainThreadException. Ich verstehe, dass dies aufgrund der Tatsache ist, dass ich Netzwerkanrufe auf dem Hauptthread versuche, aber ich habe auch Mühe, eine saubere Lösung auf Android zu finden, wie dieser Code einen anderen Thread verwenden (Async-Aufrufe).

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

} 

Oben ist mein Code, und die Ausnahme auf der Linie geworfen wird

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

Ive auch gelesen, dass Okhhtp Async-Anforderungen unterstützt, aber ich kann es wirklich nicht eine saubere Lösung für Android wie die meisten finden scheint eine neue Klasse zu verwenden, die verwendet AsyncTask <> ??

Jede Hilfe oder Anregungen sind sehr willkommen, danke ...

Antwort

16

eine asynchrone Anfragen zu versenden, verwenden Sie diese:

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

& es so nennen:

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

Es gibt keine Notwendigkeit in 'try {...} catch (IOException e) {...}' und natürlich 'doGetRequest (String url) löst IOException {' –

+0

@ V.Kalyuzhnyu Try .. catch wird den Fehler geworfen werfen b y die "doGetRequest" 'IOException' – kirtan403

+0

Danke. Sie haben Recht –