2017-04-15 295 views
0

我尝试在点击按钮时创建一个进度条。进度条只有在处理其他所有内容后才可见。runOnUiThread调用后不会立即执行

MainActivity.this.runOnUiThread(new Runnable(){ 
      @Override 
      public void run() { 
       progressBar.setVisibility(View.VISIBLE); 
      } }); 

我可以强制UI线程加入或类似的东西吗?

编辑:完整的onClick代码

public void onClick(View view) { 
    if (view == etLocation){ 
     etLocation.setText(""); 

    } 
    if (view == btnGo){ 

     //progressBar.setVisibility(View.VISIBLE); 
     MainActivity.this.runOnUiThread(new Runnable(){ 
      @Override 
      public void run() { 
       progressBar.setVisibility(View.VISIBLE); 
      } }); 

     Thread buttonpress = new Thread(new Runnable() { 
      public void run() 
      { 
       buttonGo(); 
      } 
     }); 


     buttonpress.run(); 


    } 
    if (view == datePicker){ 
     new DatePickerDialog(MainActivity.this, date, myCalendar 
       .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), 
       myCalendar.get(Calendar.DAY_OF_MONTH)).show(); 
    } 
} 
+0

为什么?只是简单地打电话给setvisibility –

+0

“在所有其他事情处理完成后”是什么意思? “我可以强制UI线程加入或类似的东西吗?” - 没有。当主应用程序线程得到控制时,你的'Runnable'应该运行。如果你的'Runnable'不是*正在运行,最有可能的原因是你正在绑定你的主应用程序线程。 – CommonsWare

+0

不起作用。我首先执行其他代码。我希望进度条显示它被调用的确切时刻。 –

回答

0

UI线程是有意异步的。应用层的工作是告诉UI线程要做什么不要当去做。

如果您的应用程序逻辑依赖于UI更新,那么您应该认为您的应用程序逻辑无论如何都要紧密耦合。

+0

我希望在加载时显示进度条。所以我在按钮被预设的那一刻开始。我不知道我该如何处理这个不同的问题。 –

+0

好吧,让我们考虑你强制显示你的下载栏(但我们这样做),你的表现会下降的小元素。形成一个非常小的文件,要求显示进度条并在完成后要求将其隐藏起来实际上更快。您的用户界面可能正忙于其他绘图事件,直到下载完成。在这种情况下,UI将被要求更新屏幕,并且它看到“这里实际上没有新东西”。 – Ray

+0

此外,屏幕在重绘(50到60Hz显示)之间有延迟,所以在绘制帧之间大约有20ms的延迟。所以如果更新屏幕的时间不是相同的纳秒,请不要担心。屏幕不会更新为另一个19.999 ... ms 异步执行事情已经足够好了 - 不必担心“请更新UI”和UI的实际呈现之间的小延迟。 – Ray

0

runOnUiThread是异步的。通过您的代码看,我看到一个简单的办法把它太:

//progressBar.setVisibility(View.VISIBLE); 


    Thread buttonpress = new Thread(new Runnable() { 
     public void run() 
     { 
      buttonGo(); 
     } 
    }); 
    //Move runOnUiThread down. The thread above will not start doing its thing until you tell it to run 
    MainActivity.this.runOnUiThread(new Runnable(){ 
     @Override 
     public void run() { 
      progressBar.setVisibility(View.VISIBLE); 
      buttonpress.run();//TO HERE. Now the progressbar will be initialized, THEN the thread will start 
     } }); 


    //buttonpress.run(); MOVE THIS 

我基本上做的是移动runOnUiThread下来,所以它可以访问ButtonPress线程。

然后,在progressBar可见之后,您将运行该线程。

+0

它不工作,我不知道为什么... –

+0

你试过我建议的吗?有没有错误? – Zoe