Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免在android中为每个类实现Parcelable,以便将其用于放置额外的数组列表_Java_Android_Arraylist_Parcelable_Parcel - Fatal编程技术网

Java 如何避免在android中为每个类实现Parcelable,以便将其用于放置额外的数组列表

Java 如何避免在android中为每个类实现Parcelable,以便将其用于放置额外的数组列表,java,android,arraylist,parcelable,parcel,Java,Android,Arraylist,Parcelable,Parcel,是否可以一次实现一个Parcelable类并将其用于所有其他类,以便在活动之间传递带有put extra array list的列表?是,带有反射 import android.os.Parcel; import android.os.Parcelable; import android.util.Log; import java.lang.reflect.Field; import java.util.ArrayList; public class ParcelableEntity imp

是否可以一次实现一个Parcelable类并将其用于所有其他类,以便在活动之间传递带有put extra array list的列表?

是,带有反射

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

import java.lang.reflect.Field;
import java.util.ArrayList;

public class ParcelableEntity implements Parcelable {
    private static final String TAG = "ParcelableEntity";

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel destination, int flags) {

        destination.writeString(this.getClass().getCanonicalName());

        for (Field field : this.getClass().getDeclaredFields()) {
            try {
                field.setAccessible(true);
                if (field.getType().equals(java.util.List.class)) {
                    destination.writeList((ArrayList) field.get(this));
                } else
                    destination.writeValue(field.get(this));
            } catch (Exception err) {
                Log.w(TAG, err.toString());
            }

        }

    }

    public static final Creator CREATOR = new Creator() {
        public ParcelableEntity createFromParcel(Parcel source) {
            try {
                Object entity = Class.forName((source.readString())).newInstance();

                for (Field field : entity.getClass().getDeclaredFields()) {
                    try {
                        field.setAccessible(true);
                        if (field.getType().equals(java.util.List.class)) {
                            ArrayList list = new ArrayList();
                            source.readList(list, Class.forName(field.getDeclaringClass().getName()).getClassLoader());
                            field.set(entity, list);
                        } else
                            field.set(entity, source.readValue(field.getType().getClassLoader()));

                    } catch (Exception err) {
                        Log.w(TAG, err.toString());
                    }
                }

                return (ParcelableEntity) entity;

            } catch (Exception err) {
                return null;
            }
        }

        public ParcelableEntity[] newArray(int size) {
            return new ParcelableEntity[size];
        }
    };

} 
现在你应该在课堂上扩展它

public class Book extends ParcelableEntity {

    public Long id;
    public String name;
}
然后使用它

public void onClick(View view) {
        ArrayList<book> lstBook = new ArrayList<>();
        Book b1 = new Book();
        b1.id = 1L;
        b1.name = "test 1";
        lstBook.add(b1);
        Book b2 = new Book();
        b2.id = 2L;
        b2.name = "test 2";       
        lstBook.add(b2);

        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.putParcelableArrayListExtra("TEST", lstBook);
        startActivity(intent);
    }
public void onClick(视图){
ArrayList lstBook=新的ArrayList();
书b1=新书();
b1.id=1L;
b1.name=“测试1”;
增加(b1);
图书b2=新书();
b2.id=2L;
b2.name=“测试2”;
新增(b2);
意向意向=新意向(MainActivity.this,SecondActivity.class);
意图。putParcelableArrayListExtra(“测试”,lstBook);
星触觉(意向);
}
是,带有反射

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

import java.lang.reflect.Field;
import java.util.ArrayList;

public class ParcelableEntity implements Parcelable {
    private static final String TAG = "ParcelableEntity";

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel destination, int flags) {

        destination.writeString(this.getClass().getCanonicalName());

        for (Field field : this.getClass().getDeclaredFields()) {
            try {
                field.setAccessible(true);
                if (field.getType().equals(java.util.List.class)) {
                    destination.writeList((ArrayList) field.get(this));
                } else
                    destination.writeValue(field.get(this));
            } catch (Exception err) {
                Log.w(TAG, err.toString());
            }

        }

    }

    public static final Creator CREATOR = new Creator() {
        public ParcelableEntity createFromParcel(Parcel source) {
            try {
                Object entity = Class.forName((source.readString())).newInstance();

                for (Field field : entity.getClass().getDeclaredFields()) {
                    try {
                        field.setAccessible(true);
                        if (field.getType().equals(java.util.List.class)) {
                            ArrayList list = new ArrayList();
                            source.readList(list, Class.forName(field.getDeclaringClass().getName()).getClassLoader());
                            field.set(entity, list);
                        } else
                            field.set(entity, source.readValue(field.getType().getClassLoader()));

                    } catch (Exception err) {
                        Log.w(TAG, err.toString());
                    }
                }

                return (ParcelableEntity) entity;

            } catch (Exception err) {
                return null;
            }
        }

        public ParcelableEntity[] newArray(int size) {
            return new ParcelableEntity[size];
        }
    };

} 
现在你应该在课堂上扩展它

public class Book extends ParcelableEntity {

    public Long id;
    public String name;
}
然后使用它

public void onClick(View view) {
        ArrayList<book> lstBook = new ArrayList<>();
        Book b1 = new Book();
        b1.id = 1L;
        b1.name = "test 1";
        lstBook.add(b1);
        Book b2 = new Book();
        b2.id = 2L;
        b2.name = "test 2";       
        lstBook.add(b2);

        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.putParcelableArrayListExtra("TEST", lstBook);
        startActivity(intent);
    }
public void onClick(视图){
ArrayList lstBook=新的ArrayList();
书b1=新书();
b1.id=1L;
b1.name=“测试1”;
增加(b1);
图书b2=新书();
b2.id=2L;
b2.name=“测试2”;
新增(b2);
意向意向=新意向(MainActivity.this,SecondActivity.class);
意图。putParcelableArrayListExtra(“测试”,lstBook);
星触觉(意向);
}

与其使用反射,不如序列化为JSON字符串(使用GSON库)并反序列化到目标类上的对象。

与其使用反射,不如序列化为JSON字符串(使用GSON库)并反序列化到目标类上的对象。

不要对抗系统。使用反射或JSON会影响性能。继续使用Parcelable,使用帮助网站,如Android Studio插件,如不要与系统对抗。使用反射或JSON会影响性能。继续使用Parcelable,使用一个助手网站,比如Android Studio插件,比如

这比GSON serialize快。我测试它。你也可以。这比GSON serialize快。我测试它。你也可以。对于少于10000条记录,我认为反射足够好。对于少于10000条记录,我认为反射足够好。