我试图通过 Intent 传递 Parcelable 数据,但尝试从 Intent 中的包中提取数据花了很长时间。
这是我编码的内容。
在调用 Activity 中 -
Parcelable objectTarget = xxx;
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("data", objectTarget);
startActivity(intent);
在目标 Activity 中 -
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// a --
Parcelable object = getIntent().getParcelableExtra("data");
// b --
}
令人惊讶的是,a 到 b 的过程在一台设备上花费了 5000 毫秒,在另一台设备上花费了 700 毫秒,并且没有抛出 TransactionTooLargeException。
我使用“GsonUtil.getInstance().toJson(value).getBytes().length;”测量了“objectTarget”的大小打印的结果是 2273。所以我猜测该物体的尺寸并不太大。
--
另外,这是我尝试过的一些事情
Bundle bundle = new Bundle();
bundle.putParcelable("data", objectTarget);
Parcelable passedObject = bundle.getParcelable("data");
而且只用了不到 2 毫秒。
--
Parcelable objectTarget = xxx;
Intent intent = new Intent(this, TargetActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("data", objectTarget);
intent.putExtras(bundle);
startActivity(intent);
在目标 Activity 中 -
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// a --
Bundle bundle = getIntent().getExtras();
Parcelable passedObject = bundle.getParcelable("data");
// b --
}
当然,这里的 a 到 b 过程大约需要。同时,开销稍多,但我只是想尝试一下。
--
当可分包数据放入 Intent 并经过“startActivty(intent)”时,编码和解编码的时间似乎比预期要长。
我真的束手无策,如果有人能解释这个问题,那就太好了。谢谢。
最佳答案
创建一个名为 ParcelabelUtil 的类
import android.os.Parcel;
import android.os.Parcelable;
public class ParcelableUtil {
public static byte[] marshall(Parcelable parcelable) {
Parcel parcel = Parcel.obtain();
parcelable.writeToParcel(parcel, 0);
byte[] bytes = parcel.marshall();
parcel.recycle();
return bytes;
}
private static Parcel unmarshall(byte[] bytes) {
Parcel parcel = Parcel.obtain();
parcel.unmarshall(bytes, 0, bytes.length);
parcel.setDataPosition(0);
return parcel;
}
public static <T> T unmarshall(byte[] bytes, Parcelable.Creator<T> creator) {
Parcel parcel = unmarshall(bytes);
T result = creator.createFromParcel(parcel);
parcel.recycle();
return result;
}
}
注意:确保您的对象实现 Parcelable 并具有一个名为 CREATOR 的静态字段,该字段是实现 Parcelable.Creator 接口(interface)的对象,用于从 Parcel 中解码或反序列化对象。请参阅下面的示例
import android.os.Parcel;
import android.os.Parcelable;
public class MyObject implements Parcelable {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
private MyObject(Parcel in) {
setName(in.readString());
setAge(in.readInte())
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(getName());
parcel.writeString(getAge());
}
public static final Parcelable.Creator<MyObject> CREATOR = new
Parcelable.Creator<MyObject>() {
public MyObject createFromParcel(Parcel in) {
return new MyObject(in);
}
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
在调用 Activity 中
// create and initialize your object(MyObject)
Intent intent = new Intent(this, TargetActivity,class);
intent.putExtra("data", ParcelableUtil.marshall(your_object); // marshall the object and pass it as a byte[]
startActivity(intent);
在被调用的 Activity 中
byte[] objectBytes = getIntent().getExtras().getByteArray("data"); // get the object byte[]
MyObject object = Parcelable.unmarshall(objectBytes, MyObject.CREATOR); // unmarshall byte[]
关于java - 从调用 Activity 中提取 Intent 中的可分割数据需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47438815/