Android RunOnUIThread不会永久更改View可见性

时间:2013-09-12 19:20:36

标签: java android view

我试图在AsyncTask的doInBackground中调用一个函数,该函数在progressBar中淡入淡出。每当我调用此函数时,进度条会根据需要淡入然后消失。我在最后添加了一个检查,告诉我,GONE方法完成后,进度条的可见性已返回runOnUIThread

  

重置程序去掉

为什么会这样,我怎样才能使进度条保持可见?

我一直在使用以下内容:

    @TargetApi(12)
    private void fadeInProgressBar(final int time, ProgressBar prog){
        System.out.println("MainActivity: Fading In ProgressBar");
        runOnUiThread(new Runnable(){
            @Override
            public void run() {
                if(usingHigherApiThan(12)&&prog.getVisibility()==View.GONE){
                    prog.setVisibility(View.VISIBLE);
                    if(prog.getAlpha()<1){
                        prog.animate().setDuration(time).alpha(1);
                    }
                }else if(prog.getVisibility()==View.GONE){
                    prog.setVisibility(View.VISIBLE);
                    final AlphaAnimation animation = new AlphaAnimation(0F, 1F);
                    animation.setDuration(time);
                    animation.setFillAfter(true);
                    prog.startAnimation(animation);
                }

            }
        });

        if(prog.getVisibility()==View.VISIBLE){
            System.out.println("Left Prog Visible");
        }else{
            System.out.println("Reset Prog To Gone");
        }
    }

注意usingHigherApiThan(12)只检查构建版本是否为12或更高版本,对于12以上和11以下都会出现此问题。

1 个答案:

答案 0 :(得分:1)

您不需要,也可能不应该这样做。 AsyncTask已经在UI线程上运行的方法(除doInBackground()之外的所有线程)

将您要在UI上运行的代码放入onPostExecute(),以便在doInBackground()完成时运行。

如果它更符合您的需求,您也可以将代码放入onProgressUpdate()并在需要时使用publishProgress()调用此函数。

或者,如果您只需要在任务开始时运行它,那么您可以将它放在onPreExecute()中。所有这些都在UI Thread上运行。没有必要使用runOnUiThread()添加额外的步骤。

AsyncTask Docs