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

标签 java android multithreading user-interface android-asynctask

我有向 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/

相关文章:

java - 在JavaFX中,类Pane的实例是一个单独的节点吗?

java - 在 Java JDBC 中查找行数的正确方法

android - 在没有用户提示或交互的情况下从 Android 卸载应用程序

java - JDBC mysql Wamp

java - Android:NTLM 身份验证、ksoap 和持久连接

java - Nativescript 插件的异步问题,被迫使用 .get

iphone - iOs后台线程中的函数调用

java - 如何在 Javafx 的 initialize() 方法期间在后台加载大文件?

c# - c#中多线程的Datagridview

java - 使用 .readlines() 方法时如何克服 "\n"