2011-08-30 5 views
2

私はこの質問が複数回尋ねられていることを知っています。私はこれらの質問を多く受けています......これらの質問のほとんどは、あなたのクラスのパーセルインタフェースの使用をスローします。 は、しかし、質問のカップルで、私は引用に出くわした:アプリケーション内で、カスタムオブジェクトをアクティビティ間で渡す最も良い方法は何ですか?

「注:Parcelableは疑問を引き起こしている可能性があります見て、なぜAndroidはビルトインのJava直列化機構 を使用していないそれはAndroidのチームが来たことが判明します?結局、 Javaのシリアル化は、Androidのプロセス間通信 の要件を満たすには遅すぎるので、チームはParcelableソリューションを構築しました。 Parcelableアプローチでは、クラスのメンバーを明示的にシリアル化する必要がありますあなたはオブジェクトのシリアライズをより速く行うことができます データを別の プロセスに渡すことを可能にする2つのメカニズム。 1つは、インテントを使用してバンドルをアクティビティに渡すことで、もう1つは、サービスに パーセルブルを渡すことです。 これらの2つのメカニズムは互換性がありません。 を混同しないでください。つまり、Parcelableはアクティビティに渡されることを意図していません。 アクティビティを開始し、それにいくつかのデータを渡したい場合は、バンドルを使用してください。 Parcelableのみ AIDL定義の一部として使用されることを意味している。」

をこの引用も今、同じアプリケーション内のすべてのアクティビティが同じで実行することを見て2

ProのAndroidの本の中で見つけることができますプロセス(Every Activity in Android is a Process,or One Application is one process)は、マニフェストで特に指定されていない限り、同じアプリケーションのアクティビティ内の通信はプロセス間通信ではありません。したがって、パーセル可能なクラスを使用するのが本当に速いか、意図?

この側面での光の放出は、大きく評価されます。 乾杯!

+0

私は個人的にアプリケーションから拡張して静的なクラスを使用しますが、これはベストプラクティスではありませんが、うまくいきます。 – PedroAGSantos

答えて

8

これにはFAQがあります。 :)

簡単な答えは、Androidチームがアプリ内のアクティビティとサービスの間でデータをやりとりするための3つの手法、つまりシングルトンクラスを推奨していることです。 public staticフィールドまたはメソッド。 ObjectへのWeakReferenceのHashMap(そしてあなたはその目的のキーを渡します)。あなたのデータが様々なライフサイクルイベントの下でどのように挙動するかを心に留めておくのが最も重要な問題です。 (たとえば、ユーザーが電話をかけると、デフォルトではアクティビティが破棄されて再作成されるため、データ処理方法はそのことを念頭に置いて設計する必要があります。)docsから

+0

ty !!多くの価値がある! – Ashwin

5

Parcelable構造は、アプリケーションのメモリ境界を越えてデータを渡す際に非常に高速に設計されています。アプリケーション内では、データが格納されているすべてのメモリ位置が送信側と受信側の両方にアクセスできるため。メモリ内のオブジェクトにアクセスできるので、再構築のコストを負う必要はありません。バンドルを使用してください。実際には、タイプ固有のput/getメソッドを使用して賞賛されたのはHashMapです。

AIDLとIPCの目的では、メモリの場所を共有することはできないため、データを効率的に移動する方法が必要です(Parcelableがここに入ります)。アプリケーションのいずれかのコンポーネントがremoteプロセス能力がある場合、Parcelableを使用する必要はありません。

+0

私もそう思った!しかし、テッドはそれを解決するための優れたリンクを提供してくれました。とにかく乾杯! – Ashwin

1

Parcelables

Parcelableプロトコルは、オブジェクトが 区画から身を読み書きするための)非常に効率的な(しかし 低レベルプロトコルを提供します。直接メソッドwriteParcelable(Parcelable、 int)とreadParcelable(ClassLoader)またはwriteParcelableArray(T []、int) とreadParcelableArray(ClassLoader)を使用して、書き込みまたは読み取りを行うことができます。これらのメソッド は、後で の読み込み時に、 クラスを適切なクラスローダーから再構築できるように、クラスタイプとそのデータをParcelに書き込みます。

もParcelablesと を動作するように、より効率的な方法を提供し、いくつかの方法があります。writeTypedArray(T []、int型)、writeTypedList(一覧)、 readTypedArray(T []、Parcelable.Creator)とreadTypedList(一覧、 Parcelable.Creator)。これらのメソッドは、元のオブジェクトのクラス情報 を書き込んでいません。代わりに、read関数の呼び出し元は Parcelable.Creatorを渡して新しいオブジェクトを適切に構築し、 データを読み込みます。 (より効率的な書き込みにシングルParceable オブジェクトを読み取るには、直接Parcelable.writeToParcelと Parcelable.Creator.createFromParcel自分自身を呼び出すことができます。)

バンドル

バンドルと呼ばれる特殊なタイプセーフなコンテナ、異種の値の キー/値マップで使用できます。これは多くの最適化 データを読み書きするときのパフォーマンスを向上させます。 タイプセーフなAPIは、最後に がデータコンテンツをParcelに整列するときにタイプエラーをデバッグするのを避けます。使用するメソッドは、 writeBundle(Bundle)、readBundle()、およびreadBundle(ClassLoader)です。

関連する問題