我想实现以下行为,但我不确定如何:
有没有办法实现这种行为?
谢谢
答案 0 :(得分:5)
创建一个Service,它自己生成自己的线程并进行后台处理。您可以将活动绑定到服务,以便在处理完成后回调活动。
答案 1 :(得分:0)
我一直在使用克里斯建议的变体:
首先创建一个IntentService,这是要创建的最简单的Service
种类。然后使用SharedPreferences表示IntentService
的状态,并在Service
和Activities
之间分享值。您的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并注册以监听完成(如果尚未完成)。