마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Parcelable 데이터 전달이 안되는경우 봐주세요 !

0 추천
원인을 찾지 못하겠네요

 

import android.os.Parcel;
import android.os.Parcelable;

public class SampleData implements Parcelable {
    public String name;
    public int age;
    public SampleData(Parcel in) {
        this.name = in.readString();
        this.age  = in.readInt();
    }

    public SampleData(String name,int age ) {
        this.name = name;
        this.age  = age;
    }

    public int getAge() {
        return this.age;
    }

    public String getName() {
        return this.name;
    }

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(this.age);
        parcel.writeString(this.name);
    }

    public static final Parcelable.Creator<SampleData> CREATOR
            = new Parcelable.Creator<SampleData>() {
        public SampleData createFromParcel(Parcel in) {
            return new SampleData(in);
        }

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

 

------ Parcelable담아서 던지는 MainActivity-----------------

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,MenuActivity.class);

                SampleData data = new SampleData("sample test",20);

                intent.putExtra("TESTTTT",data);

                startActivity(intent);

            }
        });
    }
}

 

---- 받는쪽 MenuActivity ----

public class MenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        Intent intent = getIntent();
//        Bundle bundle = getIntent().getExtras();
//        ArrayList<SampleData> list = (ArrayList<SampleData>)intent.getSerializableExtra("names");
//        List<SampleData> list = bundle.getParcelableArrayList("list");
//
        SampleData data = intent.getParcelableExtra("TESTTTT");

        Log.d("TEST",data.age+"");
        Log.d("TEST",data.name);

    }

    public void onClick(View v){
        Log.d("TEST","DD===========================");
        finish();
    }
}

 

--- > Exception

   Caused by: java.lang.NullPointerException: println needs a message
                                                                               at android.util.Log.println_native(Native Method)
                                                                               at android.util.Log.d(Log.java:143)
                                                                               at smart.tech.com.parcelable.MenuActivity.onCreate(MenuActivity.java:21)

 

안드로이드는 객체를 Intent로 넘길때 너무 어렵게 느껴집니다.

하루종일 이놈과 씨름하고 있네요

사실은 ArrayList<SampleData> 형식으로 넘길려고 하다가 안되어서 테스트로

SampleData만 넘겨봤는데 요놈도 안넘어 가내요..

이상한건 SampleData생성자에

SampleData data = new SampleData("sample test",20); <-- 값을 담아서 던졌는데

받는놈은 age = 11이담겨 있고

name은 null입니다.

당최 원인과 해결점을 모르겠내요

고수님들 한수 부탁드립니다.

감사합니다.
일 지매 (300 포인트) 님이 2018년 1월 30일 질문

2개의 답변

0 추천
aucd29 (218,390 포인트) 님이 2018년 1월 30일 답변
답변 감사드립니다.

Serializable 간단하게 넘기는군여
그런데 찝찝하네요 Parcelable 이녀석은 왜 안될까요?

아무턴 다시한번 답변 감사드립니다.
0 추천

public SampleData(Parcel in) 로 read하는 순서와 

 public void writeToParcel(Parcel parcel, int i)  로 write 순서가 달라서 발생한 듯 합니다.

아래와 같이 고쳐서 변수값을 순서대로 write하고 read 하게 수정하시면 될 겁니다.

    public void writeToParcel(Parcel parcel, int i) {

        parcel.writeString(this.name);
        parcel.writeInt(this.age);

    }

 

익명사용자 님이 2018년 1월 30일 답변
2018년 1월 30일 수정
ㅎㅎ 정말 황당하네요!
님의 말씀처럼 순서때문에 문제가 발생을 했네요
순서 변경을 하니 잘됩니다.

약간의 짜증이 나는군여 아직 안드로이드는 이런부분에 신경을 많이 안쓰는 느낌입니다.

그리고 Thread중 AsyncTask라든지 개발자 입장에서 상당히 사용하기 어려운 API라는 느낌이 강합니다.

아무턴 답변에 감사드립니다.
원래 구조가 그런것일 뿐
안드로이드가 신경 안 쓴 건 아닙니다.
 아래 링크 글을  참조 해 보세요..
http://aroundck.tistory.com/2477
http://hjh5488.tistory.com/30
...