gpt4 book ai didi

java - 获取AsyncTask的结果而不阻塞线程

转载 作者:行者123 更新时间:2023-12-02 11:01:30 26 4
gpt4 key购买 nike

我有向 AsyncTask 中的 REST API 发送请求的代码。另外,我在 preExecute() 中初始化了 ProgressDialog,并在 postExecute() 中取消了它。

我希望 ProgressDialog 显示一个不确定的旋转器(你知道,加载动画),但我也需要得到结果。 get() 阻塞了我调用它的主线程 - 这种情况的解决方法是什么?

主线程(主要 Activity )

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();
}

}

最佳答案

您可以使用 AsyncTask 的 onProgressUpdate() 方法在 UI 线程上执行操作(例如显示或更新加载动画),而 doInBackGround() 在另一个线程上执行后台工作。

基本上你调用 publishProgress() doInBackGround() 中的方法,该方法又调用 onProgressUpdate()。

查看 Android reference page以 AsyncTask 为例。

关于java - 获取AsyncTask的结果而不阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51300308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com