当在类中的 Parcelable 接口使用 ArrayList < customObject > android 系统: nullPointerException

我想使调用音乐使用 parcelable,所以我可以访问两个不同的活动中的音乐的实例的类。我不想使用可序列化的速度的目的。当我尝试将它使用传递时,我总是收到 nullPointerException:

Intent in = getIntent();
thisInstance = (Music) in.getExtras().get("MusicInstance");

音乐班: (ArrayList 是在底部的顶部和 parcelable 类)

public class Music implements Parcelable{

    private static ArrayList<genericSongClass> songs = new ArrayList<genericSongClass>();

    Cursor cursor;

    static Context context;

    public Music(Context context){
        this.context = context;
    }

    public Music(Parcel in){
        in.readTypedList(songs, genericSongClass.CREATOR);
    }

    public void BindAllSongs() {
            /** Making custom drawable */
            String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
            final String[] projection = new String[] {
                    MediaStore.Audio.Media.DISPLAY_NAME,
                    MediaStore.Audio.Media.ARTIST,
                    MediaStore.Audio.Media.DATA,
                    MediaStore.Audio.Media.ALBUM};
                    final String sortOrder = MediaStore.Audio.AudioColumns.TITLE
                            + " COLLATE LOCALIZED ASC";

                    try {
                        // the uri of the table that we want to query
                        Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                        // query the db
                        cursor = context.getContentResolver().query(uri,
                                projection, selection, null, sortOrder);
                        if (cursor != null) {
                            songs = new ArrayList<genericSongClass>(cursor.getCount());
                            cursor.moveToFirst();
                            while (!cursor.isAfterLast()) {
                                genericSongClass GSC = new genericSongClass();
                                GSC.songTitle = cursor.getString(0);
                                GSC.songArtist = cursor.getString(1);
                                GSC.songData = cursor.getString(2);
                                GSC.songAlbum = cursor.getString(3);
                                songs.add(GSC);
                                cursor.moveToNext();
                            }
                        }
                    } catch (Exception ex) {

                    } finally {
                        if (cursor != null) {
                            cursor.close();
                        }
                    }       

        }

    public static Object[] toArray(ArrayList<Object> list){
        Object[] toReturn = new Object[list.size()];
        for (int i = 0; i < list.size(); i++){
            toReturn[i] = list.get(i);
        }
        return toReturn;
    }

    public ArrayList<String> getArtists(){
        ArrayList<String> artists = new ArrayList<String>();
        for(genericSongClass gsc: songs){
            if(!artists.contains(gsc.songArtist)){
                artists.add(gsc.songArtist);
            }
        }
        Alphabetize forArtists = new Alphabetize(artists);
        return forArtists.getSortedArrayList();
    }

    public ArrayList<String> getAlbums(String artist){
        ArrayList<String> albums = new ArrayList<String>();
        for(genericSongClass gsc: songs){
            if(gsc.songArtist == artist){
                albums.add(gsc.songAlbum);
            }
        }
        Alphabetize forAlbums = new Alphabetize(albums);
        return forAlbums.getSortedArrayList();
    }

    //--- Parcel ------------------------------------------------

     public static final Parcelable.Creator<Music> CREATOR = new Parcelable.Creator<Music>() {  

            public Music createFromParcel(Parcel in) {
                return new Music(in);
            }

            @Override
            public Music[] newArray(int size) {
                return new Music[size];
            }
        };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(songs);
    }

}

genericSongClass:

public class genericSongClass implements Parcelable {
    String songTitle = "";
    String songArtist = "";
    String songData = "";
    String songAlbum = "";

    public genericSongClass(){};

    private genericSongClass(Parcel in){
        songTitle = in.readString();
        songArtist = in.readString();
        songData = in.readString();
        songAlbum = in.readString();
    }

    public static final Parcelable.Creator<genericSongClass> CREATOR = new Parcelable.Creator<genericSongClass>() {

        @Override
        public genericSongClass createFromParcel(Parcel source) {
            return new genericSongClass(source);
        }

        @Override
        public genericSongClass[] newArray(int size) {
            return new genericSongClass[size];
        }

    };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(songTitle);
        dest.writeString(songArtist);
        dest.writeString(songData);
        dest.writeString(songAlbum);
    }
}

为什么我得到 nullpointer 和如何作出补救这种情况吗?

这是我第一次使用 Parcelable,所以任何的帮助建议更是深受欢迎。先谢谢了!

解决方法 1:

到 constructor.use 请以下代码初始化您的列表。

public Music(Parcel in){
        songs = new ArrayList<genericSongClass>();
        in.readTypedList(songs, genericSongClass.CREATOR);
    }

和获得与此代码:

thisInstance = getIntent().getParcelableExtra("MusicInstance");

请确保您初始化和 thisInstance 。

时间: 2024-10-13 00:58:10

当在类中的 Parcelable 接口使用 ArrayList < customObject > android 系统: nullPointerException的相关文章

Android中的Parcelable接口

Android中的android.os.Parcelable接口用于替代Java序列化Serializable接口,Fragment以及Activtity之间都需要传递数据,有时甚至包含结构非常复杂的对象,这就需要先将这个对象序列化成二进制流,然后再进行传递了. 比如Fragment1向Fragment2传递数据,下面是Fragment1中创建Fragment2并传送数据的方法: Fragment2 fragment = new Fragment2(); Bundle bundle = new 

Android中的Parcelable接口和Serializable用法和区别

Parcelable接口: Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator inter

学习Android中的Parcelable接口

接触安桌不久,在之后很长的一段时间我将会一直在研究安桌开发.只是为了实现一下自己的想法. 1.首先要说parcelable之前必须要说一下,Serializable接口.看了很多教程,在说Activity数值传递的过程便是要先说Serializable接口,然后才是parvelable接口.两个接口相类似,有什么区别? Parcelable和Serializable的作用.效率.区别及选择: 1.作用 Serializable的作用是为了保存对象的属性到本地文件.数据库.网络流.rmi以方便数据

Action类中通过ServlexxxAware接口的方式来获取来获取web资源

1. 获取方式如下: package com.xuzhiwen.test; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.strut

类实现Parcelable接口在Intent中传递

类实现了Parcelable接口就可以在Intent中传递   只要在类的定义中实现Parcelable接口 代码 1 package entity; 2 3 import android.os.Parcel; 4 import android.os.Parcelable; 5 6 public class Person implements Parcelable { 7 8 private int id; 9 private String name; 10 private String pas

借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Parcelable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import android.os.Parcel; import android.os.Parcelable; public cl

java类中定义接口

今天看到一个java类中定义了接口,写个备忘录,记录一下 1 package com.gxf.test; 2 3 public class Test_interface { 4 public interface show{ 5 public void show(); 6 } 7 static class TestInterface implements show{ 8 9 @Override 10 public void show() { 11 System.out.println("this

Android开发当中Parcelable接口的使用

对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的. Android序列化对象主要有两种方法,实现Serializable接口.或者实现Parcelable接口.实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在进程间通信(IPC)中.实现Serializable接口非常简单,声明一下就可以了.而实现Pa

(android)Parcelable接口的使用

什么是Parcelable ? Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口.一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为"可打包的"了. Parcelable 传递对象 Android序列化对象主要有两种方法: 1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的; 2.实现Parcelable接口,Parcelable是Android特有的功能,效率比