2016-07-06 10 views
3

私は、call.execute()を使用してAsyncTaskでOkHttpリクエストを作成しようとしていました。AsyncTaskのdoInBackground()内でHTTPリクエストを行うと、UI操作がブロックされます

レイアウトに2つのボタンがあります。 button1を押すとAsyncTaskが起動し、OkHttp request.call.execute()が実行されます。

ボタン2を押すだけで、TextViewが更新されます。

観測:AsyncTaskは実行中ですが、TextViewを更新できません。

しかし、AsyncTaskを使用せずにOkHttpClient.newCall()。enqueue()メソッドを使用すると、button2を押してTextViewを更新できます。

"この場合、AsyncTaskを使用していない理由"の回答はありますか?

ソースコードサンプル:

+0

どこでもThread.sleep()またはwait()を使用していません。 –

+0

いくつかのコードを共有できますか? – M4R1KU

+0

@ M4R1KU:ソースコードを参照してください。 –

答えて

8

計算のためAsyncTask待機get()方法はdoInBackground方法で終了し、その結果を取得するためです。こちらを参照してくださいlinkdoInBackgroundがその実行を終了したり、いくつかの例外が発生があるまで

これはあなたのメインのUIThreadでウェイトモードになります(すなわち。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

回答を書く。 upvoteを与える。 –

関連する問題