2017-10-05 6 views
1

J'ai Carte des articles que je veux écouter les changements et faire quelques actions et je veux le faire dans thread séparé, mais la carte est changé, mais je pourrais l'écouter changeComment écouter les changements de valeur de HashMap dans un thread séparé le rendant fluide?

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

Cela dépend de quoi et comment voulez-vous pour être informé. Intercepter les appels de méthode Map en enveloppant removeListItem dans une classe personnalisée et en utilisant 'PublishSubject' (s) pour divers événements de modification. Notez cependant que HashMap n'est pas sûr pour les threads, donc signaler la totalité de la map à un thread séparé ou simplement en faire la lecture dans d'autres threads est dangereux. – akarnokd

+0

Ok, je vois, que penses-tu de le changer en ConcurentHashMap? Et ce que vous voulez dire "comment voulez-vous être informé?" –

+0

Les articles peuvent être ajoutés, supprimés, remplacés par quelques douzaines de méthodes, lesquels voulez-vous détecter? – akarnokd

Répondre

1

S'il vous plaît essayer la code suivant:

// 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))