2016-07-06 30 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

写答案。放弃投票。 –