2015-02-26 13 views
8

Używam OkHttp i wszystko działa poprawnie, jednak chciałem, aby wziąć pod uwagę przypadek, w którym uchwała DNS jest wyłączona, serwer jest w dół, powoli, lub po prostu zwraca coś innego niż kod stanu HTTP 200. I "Próbowałem użyć Toast, ale nie mogę, ponieważ jest to zrobione w innym wątku (?). Jak pokonać tę przeszkodę i zapewnić użytkownikowi lepsze wrażenia? Oto mój kod:Jak ostrzec użytkownika za pomocą Toast, że żądanie OkHttp zwróciło coś innego niż 200?

private void getBinary(String text) throws Exception { 
    OkHttpClient client = new OkHttpClient(); 

    String body = URLEncoder.encode(text, "utf-8"); 
    // Encrypt 
    MCrypt mcrypt = new MCrypt(); 
    String encrypted = MCrypt.bytesToHex(mcrypt.encrypt(body)); 
    Request request = new Request.Builder() 
     .url("http://mysite/my_api.php") 
     .post(RequestBody.create(MediaType.parse("text/plain"), encrypted)) 
     .addHeader("User-Agent", System.getProperty("http.agent")) 
     .build(); 

    client.newCall(request).enqueue(new Callback() { 

     @Override 
     public void onResponse(Response response) throws IOException, RuntimeException { 
      if (response.code() != 200){ 
       Toast.makeText(getSherlockActivity(), "Fail", Toast.LENGTH_LONG).show(); 
       return; 
      } 
      saveResponseToFile(response); 
     } 

     @Override 
     public void onFailure(Request arg0, IOException arg1) { 
      Toast.makeText(getSherlockActivity(), "Bigger fail", Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

Oto katastrofa:

FATAL EXCEPTION: OkHttp Dispatcher 
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
+0

Upewnij niestawienie 'metody getBinary' od głównego Ui wątek? –

Odpowiedz

12

Toast musi być pokazany w głównym wątku. Możesz użyć new Handler(Looper.getMainLooper()), aby wygenerować główny program obsługi wątków z dowolnego wątku tła, a następnie użyć go do opublikowania pracy toastu w wątku głównym.

kod jak to będzie pracować dla:

public static void backgroundThreadShortToast(final Context context, 
     final String msg) { 
    if (context != null && msg != null) { 
     new Handler(Looper.getMainLooper()).post(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 
Powiązane problemy