[英]Android: Progress bar not showing intermediate states
還有其他類似的SO問題,但沒有一個真正的幫助。
我只想實現一個進度條,即單擊按鈕時,它從0開始,逐漸移動,並在某個點停止(從sharedPreferences中讀取)。
但是,一切正常,但是進度條並沒有逐漸更新,而是直接顯示在終點。
我在這里粘貼的簡化代碼:
public class MainActivity extends ActionBarActivity {
int primaryProgress = 0;
int finalPrimaryProgress = 60;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
progressBar.setMax(100);
progressBar.setProgress(0);
}
public void click(View view) {
while (primaryProgress < finalPrimaryProgress)
{
progressBar.setProgress(primaryProgress+=1);
Thread.sleep(100); //This is inside Try-catch in actual code.
}
}
}
我知道問題出在線程上,但是我對線程不太友好,因此無法理解問題。
我假設您的“ click”方法正在UI線程上發生(否則,當您嘗試更改背景線程上的視圖時,您可能會遇到異常)。
想想您在這里做什么-單擊按鈕后,便開始循環。 在循環的每次迭代中,您都更改進度條的值,然后使(主)線程休眠100ms,然后重復執行。
問題是,您永遠不會讓運行時對所做的更改做出反應。 更改視圖的值后(例如,更改TextView的文本),Android運行時需要有時間對您的更改做出反應,調整視圖的大小,位置,然后重繪。 在您再次更改該值之前,您的代碼基本上阻止了任何事情的發生,因為您是在告訴主線程進入睡眠狀態,然后立即再次更改該值。
此處的預期結果是,一旦停止更改其值而不讓運行時實際對其執行任何操作,進度條將繪制為其最終狀態。
作為當前單擊方法的替代方法,請嘗試使用postDelayed進行操作。 這將允許運行時在每次迭代之間執行完整的度量布局繪制循環:
private void increaseProgressBar()
{
if (progressBar.getProgress() < progressBar.getMax())
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
progressBar.setProgress(progressBar.getProgress() + 1); // increase the value of the progress bar.
increaseProgressBar(); // call the function again, but after a delay.
}
}, 100);
}
public void click(View v)
{
increaseProgressBar();
}
注意:請記住,當前,多次單擊按鈕會導致行為不穩定,因為您基本上在此序列中添加了其他可運行對象,從而導致進度條增長更快。 您可以使用一個簡單的標志輕松地防御這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.