java - 从调用 Activity 中提取 Intent 中的可分割数据需要很长时间

标签 java android android-activity

我试图通过 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/

相关文章:

java - 如何设置折线图中的 "LOADING..."标签?

java - 使用 url 在 android textview 中定义新方案

android - 在不损失图像质量的情况下缩放图像不起作用

android - 显示进度条,然后在我恢复 Activity 时将其隐藏

java - 为什么我的选项卡布局总是选择当前选项卡和下一个选项卡?

java - 在 spring security 中保护两个或更多/** url

Android:多个 Intent 服务或一个具有多个 Intent 的 Intent 服务?

java - 子 Activity 线程导致应用在抑制时被卡住

Android:如何将对象从 BroadcastReceiver 发送到正在运行的 Activity

java - 如何使用 boolean 、 true 和 false 的共享首选项