簡體   English   中英

Android:進度條未顯示中間狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM