2009년 12월 28일 월요일

Parcelable을 사용할때 주의점

1. read와 write 순서를 주의한다.

2. 멤버 변수로 boolean은 사용하지 않는다.

3. boolean은 byte또는 int로 변환해서 캐스팅 할수 있게 수정한다.

public class TestPacel implements Pacelable {

    boolean _Example;

    public boolean is_Example(){

        return _Example;

    }

    public void set_Example(boolean example){

        _Example = example;

    }

}

이것을 다음과 같이 변형한다.

 

public class TestPacel implements Pacelable {

    byte _Example;

    public boolean is_Example(){

        if ( _Example == 0 ) {

            return false;

        }

        return true;

    }

    public void set_Example(boolean example){

        if ( example == false ) {

                _Example = 0;

        }else{

                _Example = 1;

        }

    }

}

 

 

4. Message의 setData에 Parcel을 추가 하지 않는다.

Message msg = new Message();

msg.what = CMD_TEST

Bundle data = new Bundle();

data.putParcel("xxxx",yyyyy);

msg.setData(data);

Intent targetIntent = new Intent( blahblah_receiver);

targetIntent.putExtra("EXTRA_MSG",msg);

sendBroadcast(targetIntent);

 

이렇게 데이터 전달을 하게 되면 받는 곳에서 마샬링 에러가 뜬다.

(android 1.6까지 해당)

 

이렇게 바꾸면 문제 없다.

 

Message msg = new Message();

msg.what = CMD_TEST

Bundle data = new Bundle();

data.putParcel("xxxx",yyyyy);

Intent targetIntent = new Intent( blahblah_receiver);

targetIntent.putExtra("EXTRA_MSG",msg);

targetIntent.putExtra("EXTRA_DATA",data);

sendBroadcast(targetIntent);

 

리시버쪽에서는

public void onReceive(Context context, Intent intent) {

 

    Message msg = intent.getParcelableExtra("EXTRA_MSG");
    Bundle data = intent.getParcelableExtra("EXTRA_DATA");

    msg.setData(data);

    process(msg);

}

요런식으로 처리 하면 된다.