2016-02-07 5 views
1

Я хочу добавить progressdialog в okhttp (асинхронный, не AsyncTask)Android okhttp Асинхронный progressdialog

, но я получил эту ошибку:

Error: Can't create handler inside thread that has not called Looper.prepare()

Как исправить это должным образом? Я хочу быть уверенным, что это лучший способ сделать это.

client.newCall(request).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 
      Log.d("TAG_response", " brak neta lub polaczenia z serwerem "); 
      e.printStackTrace(); 
     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 
       progress = ProgressDialog.show(SignUp.this, "dialog title", 
        "dialog message", true); 
      try { 
       Log.d("TAGx", response.body().string()); 
       if (response.isSuccessful()) { 
        Headers responseHeaders = response.headers(); 
        for (int i = 0, size = responseHeaders.size(); i < size; i++) { 
         //System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i)); 
         Log.d("TAG2", responseHeaders.name(i)); 
         Log.d("TAG3", responseHeaders.value(i)); 

        } 
        Log.d("TAG", response.body().string()); 
        progress.dismiss(); 
        main_activity(); 
       } 
       else{ 
        progress.dismiss(); 

        alertUserAboutError(); 
       } 
      } 
      catch (IOException e){ 
       Log.d("TAG", "error"); 
      } 

     } 

    }); 
+2

Вы должны переместить код для отображения диалогового окна, прежде чем enqueuing запрос и увольнять в OnFailure и onResponse. – thetonrifles

ответ

2

OkHttp запускает метод onResponse на том же фоновом потоке, который выполняет HTTP-вызов. Поскольку вы выполняете асинхронный вызов, это означает, что это не будет основной поток Android.

Для запуска кода на главном потоке от onResponse вы можете использовать обработчик и Runnable:

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

    Handler handler = new Handler(SignUp.this.getMainLooper()); 

    @Override 
    public void onFailure(Call call, IOException e) { 
     //... 
    } 

    @Override 
    public void onResponse(Call call, Response response) throws IOException { 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 

       // whatever you want to do on the main thread 
      } 
     }); 
    }