java - EventBus在普通对象里如何调用unregister()?
PHPz
PHPz 2017-04-18 09:49:23
0
1
516

场景:在Android里,有一个Adapter,Activity里用Eventbus来post数据到这个adapter里。

问题:我可以在Adapter的构造方法里调用register()方法:

public BroadcastAdapter(Context context) {
    mContext = context;
    EventBus.getDefault().register(this);
    Log.d(TAG, "constructor");
}

但我要在哪里调用EventBus.getDefault().unregister(this)呢?

PHPz
PHPz

学习是最好的投资!

répondre à tous(1)
刘奇

Il n'y a aucun moyen de percevoir directement l'état de ListView dans le ListAdapter correspondant à ListView. Il existe une paire de méthodes public void onAttachedToRecyclerView(RecyclerView recyclerView) et public void onDetachedFromRecyclerView(RecyclerView recyclerView) dans RecyclerView.Adapter pour répondre à vos besoins.
Mais ma suggestion est d'enregistrer et de désenregistrer le gestionnaire d'événements où le BroadcastAdapter est construit (généralement une activité ou un fragment).

Réponse supplémentaire

Selon l'affiche originale, je souhaite encapsuler complètement les éléments liés à EventBus dans BroadcastAdapter. L'existence d'EventBus ne doit pas être perçue par le monde extérieur, car il s'agit complètement d'une chose BroadcastAdapter et n'a rien à voir avec le BroadcastAdapter. les utilisateurs du BroadcastAdapter, c'est-à-dire leDécouplage.
Tout d'abord, quel est le moment approprié pour appeler pour vous inscrire et vous désinscrire d'EventBus ? Ma réponse est lorsque vous avez besoin ou non d'un traitement d'événements (absurdité...), généralement les endroits que nous utilisons couramment sont onCreate, onDestory (ou onResume, onPause). Dans le cas de l'affiche originale, cela devrait être BroadcastAdapter). . Et lorsqu'il n'est pas utilisé.
Maintenant, je suppose que l'adaptateur de l'affiche est un RecyclerView.Adapter hérité. Les public void onAttachedToRecyclerView(RecyclerView recyclerView) et public void onDetachedFromRecyclerView(RecyclerView recyclerView) mentionnés précédemment sont des méthodes qui seront rappelées lorsque l'adaptateur s'associera et se dissociera du RecyclerView. Un adaptateur n'est considéré comme un adaptateur utile que lorsqu'il est attribué à RecyclerView, donc je pense que onAttachedToRecyclerView et onDetachedFromRecyclerView correspondent à lorsque BroadcastAdapter est utilisé et lorsqu'il n'est pas utilisé . Cependant, il y a un problème. J'ai regardé le code source d'Android et j'ai découvert que onDetachedFromRecyclerView n'est appelé que lors du remplacement d'autres adaptateurs, vous devriez donc setAdapter(null) lorsque vous n'utilisez pas RecyclerView.


En fait, après avoir dit tant de choses, ce n'est pas la réponse que je veux donner - -|||, je pense que le design de l'affiche fait défaut. Un adaptateur doit consciencieusement faire son travail (adapter les données à la vue), et une vue personnalisée doit également afficher discrètement sa vue. Mon plan de conception est de placer le traitement des événements dans Activity ou Fragment Lorsque la vue doit être mise à jour pendant le traitement des événements (parfois, le traitement des événements doit non seulement mettre à jour la vue, mais peut également nécessiter la mise à jour des données, etc.). donc le placer dans View et Adapter est évidemment inapproprié), View fournit des interfaces qui peuvent mettre à jour la vue. De cette façon, Activity est responsable du traitement des événements et joue le rôle de Contrôleur, tandis que View est simplement responsable de sa vue, je pense qu'il s'agit d'un découplage. L'un des principes de conception orientée objet est le Principe de responsabilité unique.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!