当前位置: 首页 > 知识库问答 >
问题:

显示ProgressDialog、运行worker并等待worker完成的Android方法

申屠涛
2023-03-14

我需要编写静态方法来显示ProgressDialog,在线程中运行worker,并且worker完成后ProgreesDialog必须取消并且我的方法返回worker所做的操作。这是我的代码:

public static  TOut execute(final Context c, final String title, final String message, final IProgressWorker  worker, final TIn param)
{

        final ValueHolder result = new ValueHolder();
        final ProgressDialog progress=new ProgressDialog(c,R.layout.progress_impl_layout);
        Thread main = new Thread(new Runnable(){
            @Override
            public void run() {
                Looper.prepare();//creating new Looper to show progressDialog immediately 
                final Looper looper=Looper.myLooper();
                AsyncTask async = new AsyncTask(){
                    @Override
                    protected void onPostExecute(Boolean result) {
                        super.onPostExecute(result);
                        isDone=true;
                        looper.quit();//quit Looper.loop
                        progress.dismiss();
                    }
                    @Override
                    protected void onPreExecute() {
                        super.onPreExecute();
                        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        progress.setTitle(title);
                        progress.setMessage(message);
                        progress.show();
                    }

                    @Override
                    protected Boolean doInBackground(Integer... params) {
                        IProgressImpl progressImpl=new MyProgressImpl(progress);
                        worker.execute(progressImpl, param);
                        return true;
                    }
                };

                async.execute(0);
                if(!isDone){
                    Looper.loop();//show progressDialog immediately
                }
            }
        });
        main.start();
        try {
            main.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result.value;
    }

一切正常,但ProgressDialog不会取消。我怀疑looper.quit()做了什么坏事,但我需要停止looper.loop()。我调用loop(),因为我需要立即显示ProgressDialog。

共有2个答案

舒枫涟
2023-03-14

首先,存储在main变量中的线程不是主(也称为UI)线程。

对于runonuithread(),您可以在UI线程上创建一个处理程序,post(Runnable r)postdelayed(Runnable r,long delaymilis)将替换runonuithread()。[或者,您的函数已经有一个上下文参数;您可以要求它是一个activity。]

还要注意,在Android2中,在UI线程以外的线程上初始化AsyncTask类会导致错误。

最后,如果您正在使用AsyncTask,为什么需要一个单独的线程?或者,如果您已经有一个辅助线程,为什么要使用AsyncTask?你绝对不需要这两个。

李宁
2023-03-14

我建议您不要在AsyncTask中使用looper,而是使用activity.runonuithread()更新ProgressDialog方法的UI,如show()dismiss()

示例:

runOnUiThread(new Runnable() {
    @Override
        public void run() {
        progress.dismiss();       
    }
});

如果您的上下文Cactivity上下文,则可以使用它访问RunonUithRead():

    c.runOnUiThread()...

您可能必须通过各种方法使activity可用于处理类,例如将其传递到execute()方法或使用Androidapplication实例。

否则,您可以使用常规的context,但必须在线程或任务中执行上面相同的runnable

 类似资料:
  • 我的makefile中的一个目标是一个非常耗时的CPU任务。但是我可以分割工作负载并并行运行任务几次,以加快整个过程。 我的问题是make不会等待所有过程完成。 考虑一下这个简单的脚本,名为“代码> MyTask.SH <代码>: 现在,让我们从bash脚本调用它,并使用等待所有任务完成: 产出如预期: 但是在Makefile中尝试相同的方法时: 它不起作用: 当然,我可以创建多个目标,这些目标可

  • 我试图定期: 从ajax调用获取数据 将数据与div的内容进行比较 如果是数据!=div的内容:隐藏div、更改数据、显示div 这是我的密码: 问题在于,在div被完全隐藏之前,div内容被新数据替换,即使回调函数replace()被提供给hide()函数。 如何让hid()函数等待它的完成(在这个例子中是400毫秒),然后再调用替换()函数? 我还尝试了delay()和setTimeout()

  • 如果一个worker奔溃,所有分配给它的未完成的任务必须被重新分配。第一个要求就是给master能够检测worker奔溃的能力。master必须能够检测到何时一个worker奔溃了,同时也能确定哪些worker能够执行它的任务。当一个worker奔溃时,它可能最终部分的执行了任务,或者完全执行完了任务但是还未来得及上报结果。如果计算还有副作用的话,为了清理状态某些恢复步骤可能就很有必要了。

  • 本文向大家介绍python Popen 获取输出,等待运行完成示例,包括了python Popen 获取输出,等待运行完成示例的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,直接上代码吧! 以上这篇python Popen 获取输出,等待运行完成示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • JavaScript旨在在单线程环境中运行,这意味着多个脚本无法同时运行。 考虑一种情况,您需要处理UI事件,查询和处理大量API数据以及操作DOM。

  • 问题内容: 我想编写一个后台作业(EJB 3.1),该作业每分钟执行一次。为此,我使用以下注释: 工作正常。 但是,有时该工作可能需要一分钟以上。在这种情况下,计时器仍会触发,从而导致线程问题。 如果当前执行未完成,是否可以终止调度程序? 问题答案: 如果可能只有一个计时器同时处于活动状态,则有两种解决方案。 首先,应该在。在Singleton中,方法默认情况下是写锁定的,因此,当容器中仍有活动时