Parcelableオブジェクトの配列の読み込みと書き込み
2023-08-16 13:10:28
質問
以下のようなクラスがあり、オブジェクトの配列を区画から読み書きしています。
class ClassABC extends Parcelable {
MyClass[] mObjList;
private void readFromParcel(Parcel in) {
mObjList = (MyClass[]) in.readParcelableArray(
com.myApp.MyClass.class.getClassLoader()));
}
public void writeToParcel(Parcel out, int arg1) {
out.writeParcelableArray(mObjList, 0);
}
private ClassABC(Parcel in) {
readFromParcel(in);
}
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<ClassABC> CREATOR =
new Parcelable.Creator<ClassABC>() {
public ClassABC createFromParcel(Parcel in) {
return new ClassABC(in);
}
public ClassABC[] newArray(int size) {
return new ClassABC[size];
}
};
}
上記のコードで、私は
ClassCastException
を読むと
readParcelableArray
:
ERROR/AndroidRuntime(5880): 原因:java.lang.ClassCastException。[Landroid.os.Parcelable;
上記コードのどこが問題なのでしょうか?オブジェクトの配列を書きながら、まず配列を
ArrayList
?
UPDATEです。
オブジェクトの配列を
ArrayList
に変換して、parcelに追加してもいいのでしょうか?例えば、書くときに
ArrayList<MyClass> tmpArrya = new ArrayList<MyClass>(mObjList.length);
for (int loopIndex=0;loopIndex != mObjList.length;loopIndex++) {
tmpArrya.add(mObjList[loopIndex]);
}
out.writeArray(tmpArrya.toArray());
読むとき。
final ArrayList<MyClass> tmpList =
in.readArrayList(com.myApp.MyClass.class.getClassLoader());
mObjList= new MyClass[tmpList.size()];
for (int loopIndex=0;loopIndex != tmpList.size();loopIndex++) {
mObjList[loopIndex] = tmpList.get(loopIndex);
}
しかし、今度は
NullPointerException
. 上記のアプローチは正しいですか?なぜNPEを投げるのですか?
どのように解決するのですか?
配列を書くには
Parcel.writeTypedArray()
メソッドで書き、それを
Parcel.createTypedArray()
メソッドで読み取る。
MyClass[] mObjList;
public void writeToParcel(Parcel out) {
out.writeTypedArray(mObjList, 0);
}
private void readFromParcel(Parcel in) {
mObjList = in.createTypedArray(MyClass.CREATOR);
}
を使うべきではない理由は
readParcelableArray()
/
writeParcelableArray()
メソッドは
readParcelableArray()
を本当に作成するのです。
Parcelable[]
を結果として生成します。つまり、このメソッドの結果を
MyClass[]
. 代わりに
MyClass
と同じ長さの配列を作成し、 結果の配列からすべての要素を
MyClass
配列にコピーします。
Parcelable[] parcelableArray =
parcel.readParcelableArray(MyClass.class.getClassLoader());
MyClass[] resultArray = null;
if (parcelableArray != null) {
resultArray = Arrays.copyOf(parcelableArray, parcelableArray.length, MyClass[].class);
}
関連
-
[解決済み] Parcelableインターフェイスを実装した場合のbooleanの読み書きの方法を教えてください。
-
[解決済み] カスタムオブジェクトをParcelableにするにはどうすればよいですか?
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] バイト配列の画像ファイルをビットマップに変換するには?
-
[解決済み] TabLayoutに対応したandroidデザインでタブテキストのフォントを変更する
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] Android端末がHDPI画面かMDPI画面かを確認する方法は?
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] Recyclerviewと異なるタイプの行のインフレーションの処理
-
[解決済み] WhatsAppでメッセージを送信する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アンドロイドフラグメント onRestoreInstanceState
-
[解決済み] 深くネストされたスタックから離れるとき、Fragmentのバックスタックをクリーンアップする方法はこれで良いのでしょうか?
-
[解決済み] アンドロイドアプリのユーザーデータを消去する
-
[解決済み] EclipseのAndroidプロジェクトにライブラリ/JARを追加する
-
[解決済み] 文字サイズとアンドロイドの画面サイズの違い
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] LayoutParamsの高さを密度に依存しないピクセル数でプログラム的に設定する。
-
[解決済み] ViewPager2でスワイプを無効にするには?
-
[解決済み] アンドロイドボタンセレクター