2015-10-17 72 views
11

Stavo guardando il codice generato di ButterKnife e ho notato che per le annotazioni @OnClick viene utilizzato un DebouncingOnClickListener, implementato dalla libreria.Perché ButterKnife utilizza un metodo DebouncingOnClickListener per i metodi @OnClick?

Che DebouncingOnClickListener fa per evitare che più clicca sulla qualsiasi elemento utilizzando tale ascoltatore sullo stesso telaio (per raggiungere questo obiettivo usano un flag statico). È possibile vedere l'implementazione here.

Ho cercato di trovare una spiegazione sul motivo per cui hanno deciso di utilizzarlo per ogni evento su clic gestito dalla libreria, ma non sono riuscito a trovarne.

Quindi, perché lo usano? Perché hanno deciso che ogni utente di ButterKnife ha bisogno di questo? Non dovrebbe essere l'utente che decide di usarlo o no? Perché accoppiare il binding della vista aiuta a fornire questa "caratteristica"? Cosa succede se voglio ricevere più di un clic sullo stesso frame? Non potrei usare ButterKnife per gli eventi click.

Non pretendo di essere offensivo, voglio solo una spiegazione, forse mi manca qualcosa.

+0

È una libreria open source. Se ti infastidisce così tanto, sono sicuro che le richieste di pull sarebbero benvenute. In caso contrario, puoi sempre forchettarlo. – GreyBeardedGeek

risposta

5

perché hanno deciso che ogni utente di butterknife bisogno di questo?

Supponiamo di avere un pulsante e un evento clic su questo pulsante per avviare una nuova attività. Ora cosa succederà, quando l'utente digita rapidamente due volte il pulsante? C'è qualche possibilità che l'ascoltatore di clic venga licenziato due volte, quindi verranno lanciate 2 attività, che tu probabilmente non vuoi.

Ciò che questo DebouncingOnClickListener assicura è che nessun successivo listener di clic verrà considerato. Non appena si verifica il primo clic, i clic successivi verrebbero ignorati fino al fotogramma successivo, quando sarebbero attivati ​​a.

Quando si sta eseguendo un'azione con una vista, si sta pubblicando un evento su MessageQueue. Ora, quando accade il primo clic, stai pubblicando un evento: avvia una nuova attività. E stai pubblicando immediatamente un altro evento: attiva il listener dei clic, nel frame successivo. Il secondo evento è garantito che avvenga dopo il primo, perché è stato post() ed è andato in coda.

Cosa succede se desidero ricevere più di un clic sullo stesso frame?

Se è accettabile per voi di ricevere più eventi successivi click, che si dovrebbe usare @OnTouch, perché si è interessati in contatto eventi e non in eventi click.


Ascolta chiarimento @Piwai 's per quanto riguarda il caso in Fragmented Podcast #88 (a partire da 38:20).

+0

Default onClickListner dovrebbe essere implementato in questo modo. Vergogna Google – user1209216

0

Per farla breve, è per evitare che si verifichi un errore poiché gli eventi di tocco sono asincroni. Puoi anche utilizzare la libreria per associare ancora, ma assegnare regolarmente agli ascoltatori di clic.

episodio

Questo podcast copre abbastanza bene Fragmented 088

+0

Che cosa significa "gli eventi di tocco sono asincroni"? Qualche esempio? – azizbekian

+0

Significa che l'evento di tocco viene elaborato al di fuori di quello principale. Quindi non ti è garantito che le cose dell'ordine vengano elaborate in – easycheese

+0

Dubito che tu abbia un punto legittimo. – azizbekian