如何在AsyncTask中使用其他任务?

时间:2015-01-10 10:42:25

标签: android android-intent android-asynctask

我正在练习异步任务。我想在程序执行某些计算时使用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);
    }
}

如何在不停止计算的情况下移至第二项活动?

1 个答案:

答案 0 :(得分:0)

你可以让你的AsyncTask成为一个独立的类,并让它成为Activity成员(尽管更好的是弱引用)。然后,在您的第一个活动onCreate()中,您将该成员设置为第一个Activity,在第二个Activity onCreate()中设置为第二个活动onPostExecute 。 这样,您的{{1}}就会有正确的活动。

您可以使用事件总线,例如Green Robot