如何让 ProgressBar 在 OnClickListener 为 运行 时显示?

How to get ProgressBar to show while OnClickListener is running?

我有一个简单的 Android 程序可以计算 phone 计算某个数学问题需要多长时间。我希望当我按下按钮时数学问题开始,当它是 运行 时我希望显示一个旋转的进度条,我希望它在数学问题完成后消失。这是我目前拥有的代码:

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);
}

}

据我所知,在 phone 完成整个 onClick 方法之前,应用程序的视图中没有任何更新,这不是我想要的。我希望仅在程序 'working' 时显示进度条。我该怎么做?

谢谢

正如 Blackbelt 和 vilpe89 提到的,您必须将线程分开。您可以通过另一个 class 扩展 ASyncTask 来处理计算。问题在于进度对话框需要在 UI 线程上 运行。您可以有一个界面来更改主 class.

中的进度对话框

计算器class:

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),这样您就可以将计算出的持续时间传回主线程。