我正在尝试将Parcelable
内部使用Executor
的对象放入Bundle中,但很明显Bundle类通过以下方式复制对象:
使用Parcelable
接口的反射instaid。
但是,从Executor
恢复对象后,这会使Bundle
处于损坏状态。有没有一种方法可以避免这种情况并使其Executor
关闭并正确重新创建?“
这个简单的代码说明了我的问题:
主要活动示例:
public class MainSimple extends AppCompatActivity {
private static final String KEY = "key";
private MyObject object;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (savedInstanceState != null)
object = savedInstanceState.getParcelable(KEY);
else
object = new MyObject("State");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(KEY, object);
}
}
其中包含Executor
的对象:
public class MyObject implements Parcelable {
private ExecutorService es;
private String state;
public MyObject(String state) {
this.state = state;
es = Executors.newSingleThreadExecutor();
}
protected MyObject(Parcel in) {
//Not called when bundling
state = in.readString();
es = Executors.newSingleThreadExecutor();
}
public void run() {
//do something with es
es.submit(() -> Log.d("DEBUG","HELLO WORLD"));
}
public static final Creator<MyObject> CREATOR = new Creator<MyObject>() {
@Override
public MyObject createFromParcel(Parcel in) {
return new MyObject(in);
}
@Override
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(state);
}
}
从MyObject
Bundle
重新加载Executor
时,StringMap.add
不再有效。