2011-07-16 47 views
1

Androidでは、カスタムのIntentとBroadcastListenersを使用してカスタムのブロードキャストメッセージを送信しようとしています。List <Hashtable <String、List <String>>をIntentにブロードキャストするにはどうすればいいですか?

List<Hashtable<String,List<String>>> data; 

使用しよう:

intent.putExtra("mydata", data); 

が、私はエラーを取得:
The method putExtra(String, boolean) in the type Intent is not applicable for the arguments (String, List<Hashtable<String,List<String>>>) 

はテントクラスを見てみると、そこにある私は形式で、いくつかのカスタムデータを持っていますputExtra()をオーバーロードするパブリックメソッドの束。しかし、誰も私が送信しようとしているデータを満たしていないようです。

ではなく、一般的な方法

putExtra(String name, Bundle value) 

があるように思われるが、私はこれを使用するには、バンドルへの私のデータを変換するかどうかはわかりません。これは正しいことですか?それとも簡単な方法がありますか?

+1

OMG ... RUN !! List >> ..:-P –

答えて

2

putExtra(String name, Serializable s)バージョンのシリアル化が必要です。ただし、Listは、Serializableを拡張しないインターフェイスです。それをArrayListと宣言してください。

+0

ArrayListを使用していただきありがとうございます。追加作業なしでputExtra()に渡すことができました – gnychis

+1

シリアル化を使用することは本当に高価です。ドキュメンテーションによれば、それは強く推奨されません。 – hackbod

0

私はいくつかの問題を抱えていました。私は醜い方法でそれを解決しました、あなたは参考としてそれを取ることができます。

私はMapの鍵はStringで、グローバルシングルトンオブジェクトにMapを入れ、Mapは私がIntentStringキーを入れて、代わりにIntentにオブジェクトを置くこと、私はIntentに渡したいオブジェクトを保持します。インテントが渡されたActivity(またはサービス...)では、私はIntentから鍵を取得してから、本当に気にするオブジェクトをMaoから取得します。

はたぶんそれは明らかに十分ではありません、ここでは擬似コードは次のとおりです。あなたがシングルトンオブジェクト内のグローバルマップを置くので、あなたがで行われたときにMapからオブジェクトを削除する可能性があること

public void sendIntent() { 
    Object data; // the object you want to pass through Intent 
    Map<String, Object> globalMap = getMyGlobalMap(); 
    String uid = UUID.randomUUID().toString(); 
    globalMap.put(uid, data); 
    intent.putExtra(EXTRA_OBJECT_UID, uid); 
} 

public void receiveIntent() { 
    String uid = intent.getStringExtra(EXTRA_OBJECT_UID); 
    Object data = getMyGlobalMap().get(uid); // Here is your data object. 
} 

注意それはあなたのアプリケーションが生きている限り地図がそこにあるため、あなたはいくつかの無駄なオブジェクトを保持し、あなたの貴重な記憶を取ることを望まないかもしれません。

更新
別の非常に重要なことは、意図や意図は同じプロセスでなければなりません、同じプロセス内の唯一のクラスはヒープ内のデータを共有することができます受信するコンポーネントを送信するコンポーネントです。

+2

これをやっているのなら、良い主よ、放送を送信しないでください。その点は世界で何ですか?同じプロセスだけでなく、誰もがブロードキャストを利用することができます。コールバックを行うローカルオブジェクトを持っているだけです。 – hackbod

+0

@hackbod私が私の答えで述べたように、私はこれがIntentを通して複雑なオブジェクトを渡す良い方法だとは思わない。しかし、単にアプリケーション内でオブジェクトを渡したいだけで、オブジェクトをParcelable(List >>)のようにするのは本当に複雑ですが、この解決方法を検討したいと思うかもしれません。 – Tony

+0

それは私が同意したものです。アプリケーションでオブジェクトを渡す場合は、ブロードキャストを使用しないでください。ブロードキャストは、アプリケーション間でインテントを送信するためのものです。これがあなたのアプリの内部だけであれば、それは無駄です。私は巨大な*浪費 - 両方のCPU時間のために、少なくとも2つのIPCがインテント全体をシステムからアプリに戻す必要があります。プロセス間で転送することができます。 – hackbod

関連する問題