等待线程,获取结果,在进程中显示进度条并且不阻止UI线程

时间:2015-08-29 14:04:30

标签: java android multithreading android-asynctask

正如标题所暗示的那样 - 我已经对这个主题进行了大量研究,但我仍然感到困惑,无法实现我想要的目标。

在非常简化的场景中,我有一个LoginActivity,其中是方法boolean validateUserInput(String mail, String password),我想在单独的线程中进行检查输入。我想我将来会扩展它以进行登录(http请求)。当然,如果操作成功与否,我想获得布尔值 - 并且在操作过程中我想显示进度条对话框。

制作一个帖子,运行代码,返回结果,同时显示进度条,小蛋糕吧?

我应该使用asynctask还是runnable?我该怎么做,所以我不阻止UI线程?

这是我尝试在LoginActivity中使用的代码:

new Thread(new Runnable() {
                    @Override
                    public void run() {
                        mUserInputValidated = validateUserInput(inputEmail.getText().toString(), inputPassword.getText().toString());
                    }
                }).start();

                if(mUserInputValidated)
                {
                    attemptUserLogin(inputEmail.getText().toString(), inputPassword.getText().toString());
                }

我也尝试过asynctask方法,但最后出现了各种错误,因为我在onPreExecute()开始进度对话并在onPostExecute()中结束,使用类似LoginActivity.this的引用,其中存在内存问题泄漏,我也无法解决?

我认为这是非常常见的情况,因为几乎每个应用都使用它,所以 - 常见的方法是什么?如何修复代码?

1 个答案:

答案 0 :(得分:0)

你必须使用 asynctask 这将从主线程中删除工作,并在工作完成后将其放在后台线程上

这是一个展示如何操作的示例

   private class LongOperation extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }
            }
            return "Executed";
        }

        @Override
        protected void onPostExecute(String result) {
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed"); // txt.setText(result);
            // might want to change "executed" for the returned string passed
            // into onPostExecute() but that is upto you
        }

        @Override
        protected void onPreExecute() {}

        @Override
        protected void onProgressUpdate(Void... values) {}
    }

Reference