我正在练习异步任务。我想在程序执行某些计算时使用intent。 我无法在onClick中使用intent,可能在onProgressUpdate中。
public class MainActivity extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnStart=(Button) findViewById(R.id.btnStart);
Button btnAsync=(Button) findViewById(R.id.btnAsync);
btnStart.setOnClickListener(this);
btnAsync.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStart:
doLongTaskOnMain(50001);
break;
case R.id.btnAsync:
LongTask task=new LongTask();
task.execute(50000);
break;
}
}
private void doLongTaskOnMain(int number){
TextView textOutput=(TextView) findViewById(R.id.textOutput);
textOutput.setText("Calculating sum of :"+number);
long sum=0;
for(int i=0;i<number; i++){
sum+= i;
textOutput.setText("Progress"+100f*i/number);
}
textOutput.setText("Sum: "+sum);
}
class LongTask extends AsyncTask<Integer, Float, Long>{ //<Params, Progress, Result>
@Override
protected void onPreExecute() {
TextView textOutput=(TextView) findViewById(R.id.textOutput);
textOutput.setText("Start");
}
@Override
protected Long doInBackground(Integer... params) {
int number= params[0];
long sum=0;
for(int i=0;i<number;i++){
sum+=i;
publishProgress(100f*i/number);
}
return sum;
}
@Override
protected void onProgressUpdate(Float... values) {
Float progress=values[0];
TextView textOutput=(TextView) findViewById(R.id.textOutput);
textOutput.setText("progress "+Math.round(progress)+"%");
Button btnNext=(Button) findViewById(R.id.btnNext);
}
@Override
protected void onPostExecute(Long result) {
TextView textOutput=(TextView) findViewById(R.id.textOutput);
textOutput.setText("sum: "+result);
}
}
}
第二项活动:
public class SecondActivity extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button btnBack= (Button) findViewById(R.id.btnBack);
btnBack.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
Intent intent=new Intent(this,MainActivity.class);
startActivity(intent);
}
}
如何在不停止计算的情况下移至第二项活动?
答案 0 :(得分:0)
你可以让你的AsyncTask
成为一个独立的类,并让它成为Activity
成员(尽管更好的是弱引用)。然后,在您的第一个活动onCreate()
中,您将该成员设置为第一个Activity
,在第二个Activity
onCreate()
中设置为第二个活动onPostExecute
。
这样,您的{{1}}就会有正确的活动。
您可以使用事件总线,例如Green Robot