异步任务以不同的活动开始和结束

时间:2011-11-22 18:37:42

标签: android android-activity android-asynctask

我想实现以下行为,但我不确定如何:

  1. 用户开始活动
  2. 活动启动AsyncTask
  3. 用户执行一些创建新活动的操作
  4. AsyncTask完成并以某种方式将结果返回给新活动
  5. 有没有办法实现这种行为?

    谢谢

4 个答案:

答案 0 :(得分:5)

创建一个Service,它自己生成自己的线程并进行后台处理。您可以将活动绑定到服务,以便在处理完成后回调活动。

答案 1 :(得分:0)

我一直在使用克里斯建议的变体:

首先创建一个IntentService,这是要创建的最简单的Service种类。然后使用SharedPreferences表示IntentService的状态,并在ServiceActivities之间分享值。您的Activity可以将自己注册为OnSharedPreferenceChangeListener,以便了解您的服务何时完成工作和/或其关注的其他SharedPreference已更改。

使用IntentService,您只需覆盖onHandleIntent方法即可。 onHandleIntent中的所有内容都将在后台线程上运行。

答案 2 :(得分:0)

这是一种完全按照你想要的方式,假设结果是int。您可以使用parcelable对象扩展此属性。可能使用服务仍然是最好的选择。

1)创建一个名为Result的类,它是结果的包装器。它必须实现Parcelable接口:

public class Result implements Parcelable {
    private int result;

    public Result(int i) {
        super();
        result = i;
    }

    public void setResult(int result) {
        this.result = result;
    }

    public int getResult() {
        return result;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(result);
    }

    public static final Parcelable.Creator<Result> CREATOR = new Parcelable.Creator<Result>() {
        public Result createFromParcel(Parcel in) {
            return new Result(in);
        }

        public Result[] newArray(int size) {
            return new Result[size];
        }
    };

    public Result(Parcel in) {
        result = in.readInt();
    }

}

2)现在,您可以将Result对象用作第一个活动的私有变量:

public class FirstActivity extends Activity {
    private Result result;

    ....
}

3)在firstActivity中,您可以使用如下所示的行启动AsyncTask:

new MyAsyncTask(result).execute();

4)你的AsyncTask可以用这种方式制作:

class MyAsyncTask extends AsyncTask<Void, Void, Void> { // you can modify types as you want
    Result result;
    public MyAsyncTask(Result result) {
        this.result = result;
    }

    ....

    public mySetResult() {
        result.setResult(...); //set your value
    }

    ....
}

5)当您启动第二个Activity时,您可以将结果对象传递给第二个Activity:

Intent i = new Intent(getApplicationContext(), SecondActivity.class);
i.putExtra("parc", result);
startActivity(i);

6)最后,从第二个活动中,您可以使用以下代码获得结果:

Result res = (Result) getIntent().getParcelableExtra("parc");

有关parcelable对象的更多详细信息,请参阅Android Developer

答案 3 :(得分:0)

Service是一个组件,它允许某些代码在活动之外具有单独的生命周期而不与用户交互。正如其他人所提到的那样,这当然是一个需要考虑的选择。如果你这样做,IntentService是使工作异步的最简单方法。

但是,你可以继续使用AsyncTask并添加一些代码来表示它是“完整的”。如果您的应用程序被杀死,后台工作不再重要,并且如果用户离开应用程序,您可以在此工作完成之前杀死您的应用程序。另一种看待这种情况的方法是,AsyncTask的结果只对这两个活动中的一个/两个都有影响,而不是外部。这是需要服务的要求的一个重要区别,它再次提供了活动之外的生命周期。

要传递数据,请查看this doc。有很多方法可以解决这个问题,但对于这种事情,我更喜欢伪单例方法。 (我不喜欢使用SharedPreferences来传递数据,因为坦率地说我不认为这是类的用途。我更喜欢这种伪单例方法而不是纯单例,因为它更容易测试.Android使用单例方法虽然这个地方。)我在Application对象中创建了对某种AsyncTask注册器类的引用。由于可以从两个活动访问Application对象,第一个可以向注册器注册AsyncTask,第二个可以获取AsyncTask并注册以监听完成(如果尚未完成)。