簡體   English   中英

如何在OnClickListener運行時顯示ProgressBar?

[英]How to get ProgressBar to show while OnClickListener is running?

我有一個簡單的Android程序,可以計算手機計算特定數學問題所需的時間。 我希望在按下按鈕時啟動數學問題,並且在其運行時,我希望顯示一個旋轉進度條,並且希望在數學問題完成后消失。 這是我目前擁有的代碼:

public class main extends AppCompatActivity {
private TextView mScore;
private Button mRunButton;
private TextView mScoreText;
private ProgressBar mSpinner;
@Override


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mScore = (TextView) findViewById(R.id.score);
    mRunButton = (Button) findViewById(R.id.runbutton);
    mScoreText = (TextView) findViewById(R.id.scoreText);
    mSpinner = (ProgressBar) findViewById(R.id.progress);

    mSpinner.setVisibility(View.GONE);
    View.OnClickListener listener = new View.OnClickListener(){
        @Override

        public void onClick(View v) {
            mSpinner.setVisibility(View.VISIBLE);

            long startTime = System.nanoTime();
            long start  = System.currentTimeMillis();

            long count = 0l;
            for(long x=0;x<Integer.MAX_VALUE ;x++){
                count+=1;
            }
            long end = System.currentTimeMillis();

            long endTime = System.nanoTime();
            long duration = ((endTime - startTime) / 1000000);

            mScore.setText(duration + "");
            mSpinner.setVisibility(View.GONE);

        }
    };

    mRunButton.setOnClickListener(listener);
}

}

據我所知,在手機完成整個onClick方法之后,應用程序視圖中的任何內容都不會更新,這不是我想要的。 我希望進度條僅在程序“正在運行”時顯示。 我將如何去做呢?

謝謝

如Blackbelt和vilpe89所述,您必須分開線程。 您可以通過使用另一個擴展ASyncTask的類來執行此操作,該類將處理計算。 問題在於進度對話框需要在UI線程上運行。 您可以在主類中擁有一個用於更改進度對話框的界面。

計算器類:

public final class Calculator extends AsyncTask<Void, Void, Void> {

Context context;
calcCallback mCallback;

public Calculator(Context c) {
    this.context = c;
    this.mCallback = (calcCallback) c;
}

//The main class needs to implement this interface

public interface calcCallback {
    Void calcDone();
    Void calcStarted();
    //Other methods if necessary
}

@Override
protected Boolean doInBackground(Void... params) {
    mCallback.calcStarted();
    //Your calculations here
    mCallback.calcDone();
    return null;
}
}

主要活動

public class MainActivity extends Activity implements Calculator.calcCallback,  {

private TextView mScore;
private Button mRunButton;
private TextView mScoreText;
private ProgressBar mSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mScore = (TextView) findViewById(R.id.score);
mRunButton = (Button) findViewById(R.id.runbutton);
mScoreText = (TextView) findViewById(R.id.scoreText);
mSpinner = (ProgressBar) findViewById(R.id.progress);

mSpinner.setVisibility(View.GONE);
View.OnClickListener listener = new View.OnClickListener(){
    @Override

    public void onClick(View v) {
        Calculator calculator = new Calculator(MainActivity.this);
        calculator.execute();
    }
};

mRunButton.setOnClickListener(listener);

}

@Override
public Void calcStarted() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mSpinner.setVisibility(View.VISIBLE);
            }
        });
    }
    return null;
}
@Override
public Void calcDone() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mSpinner.setVisibility(View.GONE);
            }
        });
    }
    return null;
}
}

您還可以將calcDone()設置為calcDone(int duration),以便可以將計算出的持續時間傳遞回主線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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