在我的活动课程中,我想执行一系列长时间计算,按下按钮需要大约5秒才能完成。所以为了做到这一点,我创建了一个新的类,它在其run方法中执行所有计算(因为它实现了Runnable),并且在完成后我将变量设置为true来指示。在检查是否按下按钮的代码中,我启动一个新的Thread传递我的类,然后检查run方法是否已经完成。如果它完成了我然后打印数据。这个问题是当我检查计算是否已经完成时,它们实际上没有通过那行代码并且从不打印数据。我试过做异步类方法,但我认为它不会工作。有没有办法在按下按钮时创建线程,并继续检查是否已完成,以便我可以打印数据? Activity中的哪一段代码实际上是一次又一次地被执行?感谢您提供任何信息。
if(v.equals(this.button)) {
EditText param1 = (EditText)findViewById(R.id.param1);
EditText param2 = (EditText)findViewById(R.id.param2);
calculations = new MathCalc(param1.getText().toString(), param2.getText().toString());
new Thread(calculations).start();
while(!calculations.isReady());
Intent intent = new Intent(this,Show.class);
intent.putExtra("show1", calculations.getResult());
startActivity(intent);
}
这是我想要实现的目标。
答案 0 :(得分:3)
AsyncTask是适合此的工具。 AsyncTask的典型用例是,您希望在后台执行一些小操作,并在任务完成之前,期间和/或之后通过UI留下反馈。
请注意,如果用户退出并重新启动您的活动,后台运行会让您遇到麻烦,因为当从屏幕上删除活动时后台任务不会结束。
示例活动如下所示。您可以将onPreExecute
和onProgress
方法添加到AsynchTask中,以便在计算之前和计算过程中向用户提供反馈。
public class CalcActivity extends Activity {
private Button button;
private TextView resultView;
public void onCreate() {
button = (Button) findViewById(R.id.my_button);
resultView = (TextView) findViewById(R.id.result);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
button.setEnabled(false);
AsyncCalculation calc = new AsyncCalculation();
calc.execute();
}
});
}
public class AsyncCalculation extends AsyncTask<Void, Void, Integer> {
@Override
protected Integer doInBackground(Void... params) {
int result = 0;
// Do some calculation
return result;
}
@Override
protected void onPostExecute(Integer result) {
// Set the result, start another activity or do something else
resultView.setText("The result was " + result);
button.setEnabled(true);
}
}
}
答案 1 :(得分:2)
我不知道这对AsyncTask不起作用。您基本上需要覆盖两种方法 - doInBackground()
和onPostExecute()
。
您可以保证在后台计算完成后将在UI线程上调用onPostExecute()
。您也不必担心如何从另一个线程更新UI线程。
这是一个很好的example。
答案 2 :(得分:1)
使用
Button someButton = (Button) findViewById(R.id.favouriteButton);
someButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(!isDone){
doAlotOfCalculations();
}
}
});
thread.start();
}
});
private void doAlotOfCalculations(){
...
if(whenDone){
isDone = true;
}
....
}
Activity中的哪一段代码实际上是通过和执行的 又一次?
没有这样的事情。 每次启动(重新启动)此活动时都会执行onResume