2012-01-27 4 views
8

내부 클래스 Parcelable을 작성하여 해당 유형의 객체를 AIDL을 통해 원격 서비스에 전달할 수있는 방법을 알아야합니다. 이것에 대한 어떤 정보도 찾을 수 없습니다.내부 클래스를 작성하는 방법 Parcelable

여기에 내가 달성하려는 예제 코드가 있지만 Bar 클래스의 CREATOR가 정적이 될 수 없기 때문에 (즉, 내부 클래스에 있기 때문에) 컴파일되지 않습니다. Bar를 정적 내부 클래스로 만들 수는 없으며 Bar를 Foo 클래스 외부로 이동할 수 없습니다 (시스템 내의 다른 종속성). 또한 AIDL 파일에서 Bar 클래스를 참조하는 방법을 알아야합니다. 어떤 도움이라도 대단히 감사합니다.

public class Foo implements Parcelable 
{ 
    private int a; 

    public Foo() 
    { 
    } 

    public Foo(Parcel source) 
    { 
     this.a = source.readInt(); 
    } 

    public int describeContents() 
    { 
     return 0; 
    } 

    public void writeToParcel(Parcel dest, int flags) 
    { 
     dest.writeInt(this.a); 
    } 

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

    public class Bar implements Parcelable 
    { 
     private int b; 

     public Bar() 
     { 
     } 

     public Bar(Parcel source) 
     { 
      this.b = source.readInt(); 
     } 

     public int describeContents() 
     { 
      return 0; 
     } 

     public void writeToParcel(Parcel dest, int flags) 
     { 
      dest.writeInt(this.b); 
     } 

     public static final Parcelable.Creator<Bar> CREATOR 
     = new Parcelable.Creator<Bar>() 
     { 
      ... 
     } 
    } 
} 
+0

당신이 당신을 도울 것입니다 http://stackoverflow.com/questions/35923039/android-implementing-parcelable-inner-class에 좀 걸릴 수 있습니다 :

는 여기에 몇 가지 코드 앞의 예입니다. – chaitanya

+0

이 솔루션을 살펴보십시오. 도움이 될 것입니다. http://stackoverflow.com/questions/35923039/android-implementing-parcelable-inner-class – chaitanya

답변

3

대답은 내부 클래스를 항상 자체 클래스로 만들 수 있다는 것입니다. 내부 클래스가 outter 클래스의 인스턴스에서 액세스해야하는 모든 기능 또는 그 반대로 인터페이스 또는 공용 API를 통해 항상 수행 할 수 있습니다. Bar 자신의 수업을 만들어보십시오. Foo Bar의 모든 구성 요소에 대한 액세스가 필요한 경우 Foo의 인스턴스를 Bar에 전달하고 적절한 API를 구현합니다. 귀하의 외부 클래스는 내부 클래스 인스턴스에 대한 참조를 유지하는 경우

+0

답변 해 주셔서 감사합니다. 예, 이상적인 해결책이 될 것입니다. 그러나, 일부 jni 코드 (해당 C++ 다시 컴파일 할 필요가있는) Foo.Bar 기대하고있는 인터페이스() 및 Bar 가져옵니다 충돌합니다. – MichaelL

1

이처럼 할 수있는 : 나는 최근에 같은 문제로 내 상황에서 일 내부 클래스 정적하고 실행

public class OuterClass implements Parcelable 
{ 
    private InnerClass reference; 

    protected OuterClass(Parcel source) 
    { 
     this.reference = new InnerClass(source); 
     // ... 
    } 

    @Override 
    public void writeToParcel(Parcel destination, int flags) 
    { 
     reference.writeToParcel(destination, flags); 
     // ... 
    } 

    public class InnerClass implements Parcelable 
    { 
     protected InnerClass(Parcel source) 
     { 
      // Read from your parcel. 
     } 

     @Override 
     public void writeToParcel(Parcel destination, int flags) 
     { 
      // Write to your parcel. 
     } 
    } 

    public static final Parcelable.Creator<OuterClass> CREATOR = new Creator<OuterClass>() 
    { 
     @Override 
     public OuterClass createFromParcel(Parcel source) 
     { 
      return new OuterClass(source); 
     } 

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

.

이것이 실제로 작동하는 이유에 대해 읽었을 때 나에게 더 의미가 있으므로 공유 할 것이라고 생각했습니다. 내부 클래스는 다른 클래스 안에 중첩되어 있으며 포함하는 클래스의 인스턴스화에 대한 참조를가집니다. 이 참조를 통해 클래스를 포함하는 클래스 자체처럼 포함하는 클래스 멤버에 액세스 할 수 있습니다. 따라서 그것은 포함하는 클래스의 인스턴스에 바인딩되므로 정적 멤버를 가질 수 없습니다 (포함하는 클래스에 바인딩되지 않기 때문에).

중첩 클래스를 정적으로 선언하면 포함 클래스의 인스턴스와 분리되므로 고유 한 정적 변수 (일반 클래스가 가질 수있는 모든 것)를 가질 수 있습니다. 물론 그것은 포함하는 클래스의 멤버에 액세스 할 수 없습니다.

+0

내부 소멸 가능 클래스를'static'으로 선언하면 중첩 소화물 클래스를 사용할 때 저에게 효과적입니다. – Eido95

0

귀하의 변호사는 Parcelable 일 필요는 없습니다. Foo 필드와 함께 Bar 필드를 저장하고 createFromParcel(Parcel) 메서드로 전체 개체를 복원 할 수 있습니다.

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

public class Foo implements Parcelable { 
    private int mFooData = 0; 
    private Bar mBar; 

    public Foo() { 
    } 

    protected Foo(Parcel in) { 
     mFooData = in.readInt(); 

     // Reading Bar 
     int barData = in.readInt(); 
     mBar = new Bar(barData); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(mFooData); 

     // Writing Bar 
     dest.writeInt(mBar.getBarData()); 
    } 

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

    public static final Creator<Foo> CREATOR = new Creator<Foo>() { 
     @Override 
     public Foo createFromParcel(Parcel in) { 
      return new Foo(in); 
     } 

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

    public class Bar { 
     private int mBarData = 0; 

     public Bar(int barData) { 
      mBarData = barData; 
     } 

     public int getBarData() { 
      return mBarData; 
     } 

     public void setBarData(int mBarData) { 
      this.mBarData = mBarData; 
     } 
    } 
} 
관련 문제