2017-10-05 7 views
1

私は変化に耳を傾け、いくつかのアクション を作りたいと私は別のスレッドでそれをしたい項目の地図を持っていますが、マップが変更されたが、私はそれを聞くことができは別のスレッドでHashMapの値の変更を聴いて、Flowableにする方法はありますか?

val removedItemList: HashMap<Int,Item> = HashMap() 

Flowable.fromArray(removedShoppingList.values).subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe({ items -> 
     Log.i("items_removed", " " + items + items.size); 
    }) 
+0

それはあなたが通知されるようにしたいです何をどのように依存します。カスタムクラスにremoveListItemをラップし、様々な変更イベントに 'PublishSubject'を使用してMapメソッド呼び出しをインターセプトします。ただし、HashMapはスレッドセーフではないので、マップ全体を別のスレッドにシグナリングするか、他のスレッドで読み込むだけで危険です。 – akarnokd

+0

さて、ConcurentHashMapに変更するにはどう思いますか? 「どうやって通知を受けたいですか? –

+0

アイテムは数十種類の方法で追加、削除、置き換えられますが、どれを検出したいのですか? – akarnokd

答えて

1

を変更してみてください。次のコードは:

// When HashMap changed, this class emitted. 
class MapEvent(val event: EventType, val item: Item?){ 
    enum class EventType { 
     ADD, 
     REMOVE 
    } 
} 

~~~

// PublishSubject emits changed event. 
val subject = PublishSubject.create<MapEvent>() 

// Subscribe changed event. 
// When emits changed event by PublishSubject, print log. 
val obervable = subject.hide().share() 
obervable.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe {it -> Log.i("HashMap Changed", "Event: ${it.event}, Item: ${it.item}")} 

val itemList: HashMap<Int, Item> = HashMap() 
val addedItem = Item() 

// If you add or remove HashMap item, then execute onNext method in order to emit changed event. 
itemList.put(1, addedItem) 
subject.onNext(MapEvent(MapEvent.EventType.ADD, addedItem)) 
val removedItem = itemList.remove(1) 
subject.onNext(MapEvent(MapEvent.EventType.REMOVE, removedItem)) 
関連する問題