【问题标题】:Wait for thread, get its result, show progressbar in the process and do not block UI Thread等待线程,得到它的结果,在进程中显示进度条并且不阻塞 UI 线程
【发布时间】:2015-08-29 14:04:29
【问题描述】:

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

在非常简化的场景中,我有一个 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 之类的引用,但最终出现了各种错误,我也无法解决内存泄漏问题修复?

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

【问题讨论】:

    标签: java android multithreading android-asynctask


    【解决方案1】:

    您必须使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多