5

.putExtra() と sendBroadcast() を使用して IntentService から BroadcastReceiver にいくつかの作業を送信しようとしているため、HashMap< String,String> を拡張し、Serializable を実装する「Message」という独自のクラスがあります。

public class Message extends HashMap<String,String> implements Serializable{
    public MessageID ID;
    public int Encode(byte[] buff,int off);
    public int Decode(byte[] buff,int off);
    //...
}

そして、私はそれを次のように送っています:

public static void ProcessMessage(Message msg) {
    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction(Receiver.BROADCAST);
    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
    broadcastIntent.putExtra("MESSAGE",(Serializable)msg);
    parentService.sendBroadcast(broadcastIntent);
    Print("Broadcasting intent to receiver ("+Receiver.BROADCAST+") from: "+parentService.toString());
}

そして、このように受け取ります:

public void onReceive(Context context, Intent intent) {
    Sys.Print("Receiver handling: "+intent.getAction());
    if(intent.getAction().equals(BROADCAST)){
        try {
            Message msg = (Message) intent.getSerializableExtra("MESSAGE");
            Sys.Print("Receiver handling " + msg.ID.toString());
        } catch(Exception ex){
            Sys.Print("Failed handling message, reason: "+ex.getStackTrace().toString());
        }
    }
}

しかし、ここでは常にこれを取得します:"Failed handling message, reason: java.lang.ClassCastException: java.util.HashMap"

何が間違っている可能性がありますか?

スタックトレース:

com.myapp.Receiver.onReceive(Receiver.java:24)
android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)
android.os.Handler.handleCallback(Handler.java:587)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:138)
android.app.ActivityThread.main(ActivityThread.java:3701)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
dalvik.system.NativeStart.main(Native Method)

最後に、誰かが同様の問題を抱えていた場合、私は次のように解決しました:

public class Message implements Parcelable {
    public HashMap<String,String> Data;
    public Message(){
        Data=new HashMap<>();
    }
    public int Encode(byte[] buff,int off);
    public int Decode(byte[] buff,int off);
    public void Add(String i,String v);
    public String At(String i);
    public boolean ContainsKey(String i);
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeMap(this.Data);
    }
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public Message createFromParcel(Parcel in) {
            return new Message(in);
        }
        public Message[] newArray(int size) {
            return new Message[size];
        }
    };
    public Message(Parcel in) {
        Data=new HashMap<>();
        in.readMap(this.Data,String.class.getClassLoader());
    }
}
4

2 に答える 2

2

あなたは答えが気に入らないでしょう。

エクストラは に保存されますBundle。Android は s のコンテンツに対していくつかの「最適化」を行い、Bundle型がわかっている場合にエントリをシリアライズ/デシリアライズする方法を賢くしようとします。したがって、Mapインターフェイスを実装するものをBundleに入れると、それを元に戻すとHashMap:-(

メカニズムの詳細な説明については、この質問に対する私の回答を参照してください。

問題を解決するには、カスタム クラスでa を使用(つまり、含む) し、 aHashMapではなく(つまり、継承) する必要があります。HashMap

于 2015-04-12T13:49:03.580 に答える