2016-07-06 54 views
3

我正在嘗試使用call.execute() - 同步調用在AsyncTask中發出OkHttp請求。使用OkHttp庫進行HTTP請求內部doInBackground()AsyncTask阻止UI操作

我在佈局中有兩個按鈕。按button1啓動AsyncTask,執行OkHttp request.call.execute()。

並按下button2,我只是更新一個TextView。

觀察:雖然AsyncTask正在運行,但我無法更新TextView。但是,如果我不使用AsyncTask並使用OkHttpClient.newCall()。enqueue()方法,那麼我可以通過按下按鈕2來更新TextView。

「爲什麼在這種情況下使用AsyncTask不工作」的任何答案?

源代碼示例:

+0

我沒有在任何地方使用Thread.sleep()或wait()。 –

+0

你能分享一些代碼嗎? – M4R1KU

+0

@ M4R1KU:立即查看源代碼。 –

回答

8

這是因爲AsyncTask等待計算get()方法在doInBackground方法完成,然後獲取其結果。看到這個link

這將使你的主要在UIThread等待模式,直到doInBackground完成它的執行還是有一些例外發生(即。CancellationExceptionExecutionExceptionInterruptedException)。

您應該使用onPostExecute(Result)替代方法AsyncTask

private class OkHttpHandler extends AsyncTask<String, Void, byte[]> { 

     OkHttpClient client = new OkHttpClient(); 

     @Override 
     protected byte[] doInBackground(String... params) { 

      Request.Builder builder = new Request.Builder(); 
      builder.url(params[0]); 
      Request request = builder.build(); 
      try { 
       Response response = client.newCall(request).execute(); 
       return response.body().bytes(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(byte[] bytes) { 
      super.onPostExecute(bytes); 
      try { 
       if (bytes != null && bytes.length > 0) { 
        Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
        imageView.setImageBitmap(bitmap); 
        tv.setText("Total btytes download: " + bytes.length); 
       } 
      } catch (Exception e) { 
       tv.setText("sorry, something went wrong!"); 
      } 
     } 
    } 
+0

寫答案。放棄投票。 –