【发布时间】:2018-07-12 08:03:08
【问题描述】:
我有向 AsyncTask 中的 REST API 发送请求的代码。
另外,我在preExecute() 中有一个 ProgressDialog 初始化,在postExecute() 中有一个将其关闭。
我希望 ProgressDialog 显示一个不确定的微调器(你知道,加载动画),但我也需要得到一个结果。 get() 阻塞了我调用它的主线程 - 这种情况的解决方法是什么?
主线程(主要活动)
LoginTask task_login = new LoginTask();
AsyncTask<String, Void, JSONObject> response = task_login.execute(et_username.getText().toString(), et_password.getText().toString());
try {
JSONObject json = response.get();
Toast.makeText(MainActivity.this, json.toString(), Toast.LENGTH_SHORT).show();
} catch (InterruptedException e) {
Toast.makeText(MainActivity.this, "Interrupted.", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
AsyncTask(虚拟 doInBackground):
public class LoginTask extends AsyncTask<String, Void, JSONObject> {
private LoginTask self = this;
private ProgressDialog progressDialog;
@Override
protected JSONObject doInBackground(String... params) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(MainActivity.context,
"Logging in...", "");
progressDialog.setButton(DialogInterface.BUTTON_NEUTRAL,
MainActivity.context.getResources().getResourceEntryName(R.string.dialog_button_cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
self.cancel(true);
}
});
}
@Override
protected void onPostExecute(JSONObject jsonObject) {
super.onPostExecute(jsonObject);
progressDialog.dismiss();
}
}
【问题讨论】:
-
在此处显示您的代码。所以我可以建议你更新。
-
顺便说一下,当有众所周知的库 Volley 和 Retrofit 时,为什么要通过 HTTP 实现 Api 调用。
-
我使用okhttp发送请求
-
在 onPostExecute 中可以获取数据时,为什么还要使用
.get();?你完全破坏了 AsyncTask 的目的。 -
Welp,我不知道我应该把代码放到postExecute中。
标签: java android multithreading user-interface android-asynctask