从Bundle恢复时重新启动执行程序

时间:2017-02-19 22:27:51

标签: java android multithreading reflection parcelable

我正在尝试将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不再有效。

0 个答案:

没有答案