13

同様の質問が何度も出されていることは承知しています。ほとんど読んだと思います。しかし、どれも当てはまりません。

インテント (アクティビティ呼び出し/ブロードキャスト) を介して複雑なオブジェクトを渡す必要があります。すべてが私のプロセス内で行われます。そのため、数ミリ秒後にオブジェクトを再アセンブルするためだけに、オブジェクトを Streams に書き込む理由がわかりません。アプリケーションを介してオブジェクト参照を渡したいです。これを行う方法はありますか。

私のアプリケーションは同じイベントを複数回続けてブロードキャストするため、静的メンバーに頼ることはできません。ブロードキャストしたものとまったく同じオブジェクトを取得する必要があります。

そのため、オブジェクトを受け入れ、内部リストでこのオブジェクトを識別する整数を返す静的な「参照ホルダー」について考えていたので、.putExtras を介してこの整数を渡すことができます。しかし、私がJavaを知る限り、このオブジェクトが追加された後、このリストからこのオブジェクトをクリーンアップすることはできませんでした.いつでも再開できます - たとえ 2 分後でも)。

何か案は?私は何か間違ったことをしていますか?または、参照をクリーンアップする方法についてのアイデア (おそらく数秒後ですか?これはクラッシュにつながる可能性がありますが、理由もなくオブジェクトをアセンブルおよび再アセンブルするコードを記述するよりも適切なようです)

4

2 に答える 2

7

オプションは非常に明確です。マーシャリング不可能なオブジェクト (Parcelable、Serializable) を Intent に渡す方法はありません。完全停止。

あなたができることは、マーシャリング不可能なオブジェクトへの参照である何かを渡すことです。アイデアは、そのキーを渡したい値にマップするマップにキーを渡す順序で何かを行うということです。インテントの送信者とインテントの受信者の両方がマップにアクセスできる場合、マーシャリング不可能なオブジェクトへの参照を通信できます。

静的メンバーが必要なものではないと思う理由が正確にはわかりません。カスタム Application オブジェクトの静的マップは、まさにあなたが望むものであると思います。...そして、WeakHashMaps に関するあなたのコメントから、まさにそれを発見したのではないかと思います。

...ただし、マップを弱体化する理由について、これまでに説明したことは何もありません。弱いマップを使用する前に、ソフト参照を見て、それが意図したものではないことを確認してください。

幸運を祈ります

于 2013-02-17T02:01:14.633 に答える
4

編集:

この解決策は忘れてください。それは動作しません。Android は、.startActivity() で渡す Intent に対応しています。アクティビティ内で参照を取得する方法はありません。これは - 私の意見では - 素晴らしいですが、私のグーグルです。アクティビティを呼び出して、オブジェクトの参照を静的メンバーに配置する必要があります...

G. Blake Meike が述べたように、Android で Intents を介してオブジェクト参照を渡す方法はありません。しかし、おそらくWeakReferencesを使用できます。

このトピックに関する非常に優れた論文がここにあります: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

この質問を通じてその解決策にたどり着きました: オブジェクト参照カウントを取得することは可能ですか?

基本的には、 Intents をWeakHashMapの Key として使用し、Object を値として渡します。インテント エクストラに入れるものはすべてシリアル化されるため、キーとして適切なオブジェクトはこれだけのようです。そのため、インテントごとに 1 つのオブジェクトしか渡すことができません。オブジェクトを保持できるアクティビティ内にサブクラスを実装し、代わりにこのサブクラスをマップに配置できます。しかし、受信者が取得する Intent オブジェクトが呼び出し元が作成したものと同じかどうかはまだわかりませんが、そう思います。そうでない場合は、このソリューションを編集します (または、誰かがそれを解決できるかもしれません)。

于 2013-02-17T02:29:21.070 に答える