我试图使用call.execute()在AsyncTask中进行OkHttp请求 -- 同步调用。
我的布局中有两个按钮。按下button1会启动AsyncTask,然后执行OkHttp请求的call.execute()方法。
而按下button2,我只是更新TextView。
观察结果:当AsyncTask正在运行时,我无法更新TextView。
但是,如果我不使用AsyncTask,而是使用OkHttpClient.newCall().enqueue()方法,那么我可以通过按下button2来更新TextView。
为什么在这种情况下使用AsyncTask不起作用?
源代码示例:
bpost = (Button) findViewById(R.id.bpost);
bpost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
i++;
tv.setText(""+i);
}
});
bstart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpHandler handler = new OkHttpHandler();
byte[] image = new byte[0];
try {
image = handler.execute(url).get();
if (image != null && image.length > 0) {
Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
imageView.setImageBitmap(bitmap);
tv.setText("Total btytes download: " + image.length);
}
} catch (Exception e) {
tv.setText("sorry, something went wrong!");
}
}
public 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;
}
}