详解责任链模式以及Android事件分发

简介

职责链方法,是行为型规划方法之一。咱们将多个节点首尾相连所构成的模型称之为“链”,关于链式结构,每个节点都能够被拆开再链接,因而,链式结构就会有很大的websocket服务器活络性。假定咱们将每个链上的节点看作为一个方针,每一个方针有不同android手机的处理逻辑,将一个央求从链子的第一个节点动身,沿着途径依次传递给每一个节点方针,直到有某个方针对源码编辑器手机版下载这个央求进行了处动画大放映理间断,这便是职责链方法。

界说:使多个方针都有时机处理央求,然后防止央求的发送者和接纳者之间的耦合联系。将这些方针连成一条链,并沿着这条链传递这个央求,直到有方针处理间断websocket是什么意思

画个图吧

详解职责链方法以及Android事情分发
这就源码是什么意思是职责链的UML图,其间android是什么手机牌子

  • AbstractHandler:链表怎么调节长度笼统处理者,其间包含有next,指向下一个处理者
  • Handler1、Handler2:都是AbstractHandler的动画头像子类,是详细央求者
  • AbstractRequest:链表排序笼统央求者
  • Request1、Reques动画电影t链表是线性结构吗2:笼统央求者的子类,详细央求者

简略完毕

  1. 界说笼统央求
public abstract class AbstractRequest {
private String name;
public AbstractRequest(Str链表ing name){
this.name = namewebsocket服务器;
}
public Object getName(){
return name;
}
/**
* 央求的level
* @return
*/
public abs源码共享网tract int getRequestLevel();
  1. 界说笼统处理者
pub链表c言语lic abstract class AbstractHandler {
//下一个处理者的引用
protandroid体系ected AbstractHandler next;
public abstract int getLevel();
public abstr链表数据结构act void handle(Abs链表tractRequest request);
public final voi链表数据结构d handleR源码之家equest(AbstractRequest request){
//央求者和处理者的level相一起处理
if(getLevel() == request.getRequestLevel()){
handle(request);
}else{
if(nexwebsocket原理t!=null){
//调用下一个节点的handleRequest办法
next.handleRequest(request)android平板电脑价格;
}else{
Sandroid/yunosystem.out.println("n动画图片头像o one can handle iandroid什么意思t!!");
}
}
}
}
  1. 详细央求者

这儿能够界说多个,篇幅原因只展现其间一个央求者

public class MyRequest extends Abstrac链表tRequest{
public MyRequest(String name) {
super(name);
}
@Override
public int getRequestLevel() {
return 1;
}
}
  1. 详细处理者

同上,这儿能够界说多个,篇幅原因只android电子市场展现其间一动画片汪汪队个处理者

public class MyHandler1 extends AbstractHandler{
@Override
public int getLevel(链表的特色) {
return 1;
}
@Override
public void handle(AbstractRequest request) {
System.out.pwebsocket心跳重连机制rin链表结构tln("1号处理者处理"+request.getName(动画专业));
}
}
  1. 查验
public class Test {
publicAndroid static void main(String[] args) {
AbstractHandler one = new MyHa源码ndler1();
AbstractHandle动画片小猪佩奇r two = new MyHandler2();
o源码编辑器手机版下载ne.next = two;
AbstractRequest request1动画大放映 = new MyRequest("request1");
AbstractRequest request2源码 = new MyRequest2("request2");
one.han链表是线性结构吗dleRequest(request1);
one.hanwebsocket是什么意思dleRequeandroid下载st(request2);
}
}
  1. 作用
1号处理者处理reque动画片猫和老鼠st1
二号处理者处理request2

能够看到,都是从one开始的,可是已经有了链式结构的调用进程了。

okhttp的阻遏器职责链

Response getRespoAndroidnseWithInterceptorChain() t源码本钱hrows IOException {
// Buil源码是什么意思d a full stack of interceptors.
List<Intercep源码是什么意思tor> interceptors = new ArrayList<>();
intercepandroid是什么手机牌子tors.addAll(client.interceandroid的drawable类ptorswebsocket的缺陷和缺乏());
interceptors.add(retryAndFollowUpInterceptor);
intercep动画片少儿小猪佩奇tors.add(new BridgeInterceptor(client.cookieJar()));
inteandroid是什么手机牌子rceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new Conandroid下载安装nectInterceptor(cli动画头像ent))动画片少儿小猪佩奇;
if (!forWebandroid什么意思Socket) {
intercept动画片猫和老鼠ors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
Interceptor.Chain chain = new RealInterceptorChain(interceptors源码资源站, null, null, null, 0,
ori源码编辑器ginalRequest, this, eventListener, client.connectTimeoutMillis(),
client.readTimandroid/yunoseouwebsocket的缺陷和缺乏tMillis(), client.writeTimeoutMillis());
retu链表数据结构rn chainwebsocket原理.proceed(originalRequest);
}
  • RetryAndFollowInterceptor:重websocket协议定向阻遏器,处理重试的阻遏器,会处理一些失常,只需源码年代训练怎么样不是丧身的失常就会从头主张一次央求。
  • BridgeInterc动画制造软件eptor:桥接源码之家阻遏器,设置一些通用的header头信息,Cookie、Connection、Content-type等,对回来信息android的drawable类做一些处理,websocket协议数据的紧缩等
  • CacheIntercwebsocket和socket差异eptor:缓存阻遏器,在缓存可用的状况下,读取本地的缓存,假定没有则直接从服务器获取,假定有,则判别是否有缓存策源码资源站略,之后判别是否过期,没有过期则直接从缓存中获取,假定过期了,就增加一些头信息,服务器会判别是否有修正,然后可能会回来304,代表依然能够从缓存中获取,否则就从服务器获取。
  • Conn动画片汪汪队ectInterceptor:联接阻遏器,调用finwebsocket服务器dHealthyConnection()办法找到一个联接,并判别是否健康,没有则创建socket联接并缓存。OkHttp是基于原生的socket+okio完毕的,
  • CallServerInterceptor:央求阻遏器,给服务端写数据和读取数据

在上边的代码中通过调用动画片猫和老鼠 RealInterceptorChain 的 proceed 办法来完毕职责链条的运转,咱们

Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
originalRequest, this, eventListener, client.connectTimeoutMillis(),
clwebsocket和socket差异ient.readTimeoandroid的drawable类utMillis(), client.writeTimeoutMillis());

那就来看一下proceed这个办法的完毕:

RealInterceptorChain.java
public Response proceed(Request request, Stwebsocket服务器reamAllo链表c言语cation streamAllocation, HttpCodec httpCodec,
RealConnection connection) throws IOException {
if (index >= interceptors.size())链表数据结构 throw new AssertionError();源码
...
// Call the next in源码编辑器terceptor in the chain.
RealInterceptorChain nex链表数据结构t = new RealInterceptorChain(interceptors, streamAllocation, httpCodec,
connection, index + 1, request, call, eventListener, connectTimeou链表结构t, readTimeout,
writeTimeout);
Interceptorandroid什么意思 interceptor = interceptors.get(index);
Response response = interceptor.intercept(next);
...
return response;
}

留心看,这个办法中有个index的变量,一起在链表是线性结构吗这儿又新建了 RealInterceptorChain 自己,不过传的参数变为 index+1,这样获取到的intewebsocket完成1对1谈天rceptor就变为 阻遏器链表中的下一个阻遏器了,然后将request传递给下一个阻遏器android平板电脑价格,让其进行相应android体系的处理。

view作业分发职责链

view的层级

当咱们写Aandroid/yunosctivity的时分,会调用setCont链表回转entView办法来加载布局,那就先来看看setContentwebsocket和socket差异View办法的完毕吧

public void sandroid下载安装etContentView(@LayoutRes int源码编辑器 layoutResID) {
getWindow().setC源码交易平台ontentVie动画片汪汪队w(layoutResID);链表结构
initWindowDecorActionBar();
}

这儿调用了getWindow().setContentView(layoutRandroid什么意思esID), getWindow()办法又做了什么呢?

public Window getWindow() {
return mWindow;
}websocket的缺陷和缺乏

回来了mWindow,这个mWindo动画制造软件w是什么?咱们在attach()办法中找到了答案

final void attach(Context context, ActivityThread aThread,
Instrumentation链表c言语 instr, IBinde动画片小猪佩奇r token, int ident,
Application applwebsocket心跳重连机制ication, I链表是线性结构吗ntent intent, ActivityInfwebsocket协议o info,
CharSequence title, Activitandroid什么意思y parent, String id,
Non源码编辑器ConfigurationInstances lastNonConfigurationInstances,
Configurat源码ioandroid下载n config, String referrer, IVoiceInteractor vo源码iceInteractor,
Window window,websocket菜鸟教程 ActivityConfigCallback activit动画头像yConf源码年代igCallback) {
attachBaseContext(context);
mWindow = new PhoneWindow(thiswebsocket的缺陷和缺乏, window, activit源码编辑器yConfigCallback);
...
}

原本这个mWindow便是PhoneWindow,PhoneWindow是Window的仅有完毕类,所以咱们看一下PhoneWindow中seandroid体系tContentView()是怎么完毕的吧

public void setCandroid是什么手机牌子ontentViandroid是什么手机牌子ew(int layoutResID) {
if (mContentParent == null) {
installDecor();
} elandroid/yunosse i源码编辑器手机版下载f (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
...
}
private void installDecor() {
mForceDecorInstall = false;
if (mDecor动画片汪汪队 == null) {
mDecor = generateDecor(-1);
} else {
mDecor.setWindow(this);
}
...
if (mContentParent == null) {
mContentParent = ge链表c言语nerateLayout(mDecor);
....
}
}
protected DecorView generateDecor(int featureId) {
...
return new DecorView(context, featureId, this, getAttributes());
}

能够看到这儿究竟创建了DecorView,这个DecorView便是Activity中的根view,接着查看DecorView的源码,DecorView承继自FrameLayout。

详解职责链方法以及Android事情分发

会到installDecor这个办法中,mDecoandroid的drawable类r初始化之后,执行 generate动画头像Layowebsocket完成1对1谈天ut(mDecor)链表数据结构这个办法,咱们看一下它的完毕

protected ViewGroup gene链表rateLayout(DecorV链表和数组的差异iew decor) {
...
int layoutResource;
...
} else if ((features & (1 <&l动画图片头像t; FEATURE_NO_TITLE)) == 0) {
// If no other feat动画电影ures and not embedded, only need a title.
//android什么意思 If the window is floating, weandroid/yunos need a dialog layout
if (mIsFloating) {
TypedValue re动画头像s = new TypedValue(android电子市场);
getContext().getTheme().resolveAttribute(
R.attr.dialogTitleDecorwebsocket服务器Layout, res, true);
lAndroidayoutResourc链表e = res.resourceId;
} else if ((features &动画电影amp; (1 << FEATURE_ACTION_BAR)) != 0) {
layoutResource = a.getResourceId(
R.styleable.Window_win动画制造软件dowActionBarFullscreenDecorLayout,
R.layout.screen_actandroid下载ion_bar);
} else {
layoutRes源码资源站ource = R.layout.screen_titl源码共享网e;
}
...
return contentParent;
}

这个办法又臭又长,这儿源码编辑器手机版下载截取一部分,其主要内容便是根websocket协议据不同的状况加载不同的布局给layoutResource。
能够看到 layoutResource源码是什么意思 = R.lay动画头像out.screen_title 这句代码,

<LinearLayout xmln链表是线性结构吗s:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
awebsocket是什么意思ndroid:fitsSystemWindows="true">
<!-- Popout bar for action modes -->
<ViewStub android:id="@+id/actiandroid/yunoson_mode_bar_stub"
android:inflatedId="@+id链表回转/action_mode_bar"
android:la链表的优点yout="@layout/action_mode_bar"
android:layout_width="match_p链表数据结构arent"
android:layout_height="wrap_content"
android:theme="?attr/actionBarTheme" />
<FrameLa源码编辑器手机版下载yout
android:layout_链表结构width="match_parent"
android:layout_height="?android:attr/windowTitleSize"
style链表数据结构="?android:attr/windowTitleBackgroundStyle">
<TextView android:id="@android:链表c言语id/title"
style="源码是什么意思?android:attr/w源码年代indowTitleStyle"
android:background="@null"
android:fadingEdge="horizontal"
android:gravit链表排序y="center_vertiWebSocketcal"
andr链表的特色oid:layout_width="ma链表的优点tch_parent"
android:layout_hwebsocket的缺陷和缺乏eight="match_parent" />
</FrameLayou动画片猫和老鼠t>
<FrameLayout android:id="@android:id/conte动画片汪汪队nt"
androidwebsocket的缺陷和缺乏:layandroid手机out_width="match_parent"
android:layout_height="0dip"
android:lay链表结构out_weight="1"
android:for动画egroundGravity="fill_ho源码本钱rizontal|top"
android:foreground="?android:attr/windowContandroid下载安装entOverlay" />
</动画片少儿小猪佩奇LiAndroidnearLayout>

这个xml源码编辑器文件如上所示, ViewStub是用来闪现Ac链表和数组的差异tionbar的,下边的两个FrameLayout,一个是title用来闪现标题,一个是content用来闪现内容。

看到这儿就应该大致了解了Activity的层级。一个Actandroid的drawable类ivity包含一个Window方针,这个方针便是PhoneWindow,PhoneWindow将DecorView作为整个运用窗口的跟view,而这个DecorView又将屏幕分为两个区域:TItleView和ContentView,咱们平时所编写的布局便是展现在这个ContentView中。

如图所示:

详解职责链方法以及Android事情分发

作业分发

当咱们点击屏幕时,就产生了点击作业,这个作业被封装为一个类:MotionEvent。当MotionEvent产生之后,体系就会将这个MotionEvent传递给View的层级,究竟将作业websocket协议传递给一个详细的vi源码交易平台ew,这个传递的进程便是作业的分发。这一般涉及到三个比较关键的办法:

  • dispatchTouchEvent(MotionE链表是线性结构吗vent ev):进行作业分发,假定作业传递到其时view,那么这链表和数组的差异个办法一定会调用,回来的作用受其时源码年代训练怎么样view的onTouchEvent和下级view的dispatchTouchEvent办法的影响,标明是否消费这个作业。
  • onInterceptTouchEvent(Motio动画专业nEvent ev):进行作业动画电影的阻遏,在dispatchTouchEvent办法中调用,View中是没有这个办法的。假定其链表排序时的ViewGroup阻遏了此工源码之家作,那么在同一个作业序列中,此办法不会再次被调用,回来作用标明是否阻遏其时作业。
  • onTouchEvent(Mwebsocket的缺陷和缺乏otionEvent ev):用来处理作业,在dispatchTouchEvent方链表回转法中调用。回来作用标明是否消耗其时作业,假定不消耗,则在此作业序列中,其时view无法再次接纳到作业。
ViewGroup

当点击作业产生后,作业首要会传递给其时的Activity,这会调用Activity的dispatchToucwebsocket协议hEvent办法,Activity会将详细的作业交给PhoneWindow来完毕,PhoneWindow又会将作业的处理作业交给DecorView,之后DecorView就会交给根ViewGroup。所以咱们直接从ViewGroup的dispatchTouchEvent办法开始剖析。因为办法比较长,所以分段进行剖析

public boolean dispatchTouchEvent(MotionEwebsocket的缺陷和缺乏vent ev) {
...
boolean handled = false;
if (onFilterTouchEventForSecurity(ev)) {
final int action = ev.getAction();
final int a源码编辑器ctionMasked = action & MotionE链表的特色vent.ACTION_MASK;
// Handle an initial down.
if (actionMasked == MotionEvent.ACTION_DOWN) {
//重置状况
cancelAndClearTouchTargets(ev);
resetTouchState();
}
// Check for interception.
final boolean intercepted;
//当作业类型为ACTION_DOWN或许mFirstTouchTargetwebsocket协议!=源码null时,会判android下载别是否要阻遏作业
if (actionMasked == MotionEvent.android手机ACTION_DOWN
|| mFirstTouchTarget != null) {
//判别disallowIntercewebsocket面试题pt符号位android手机,假定为true,则不阻遏
final源码之家 boolean disalwebsocket完成1对1谈天lowIntercept = (mGroupFlags & FLAG_DISwebsocket的缺陷和缺乏ALLOW_INTERCEPT) != 0;
if (!disallowIntercept) {
intercepted = onInterceptTouchEvent(ev);
ev.setAction(action); // restore action in ca源码年代se it was changed
} else {
intercepted = false;
}
} else {
// There are no touch targets and this action is not an动画电影 initial down
// so t源码共享网his view group continues to intercept touches.
intercepted = true;
}
...
}

总结一下:首要判别是否为down作业,假定是,则进行初始化,并将mFirstTouchTarget的值置空,以为一个源码是什么意思无缺的作业序列是从down开始的,android平板电脑价格

ViewGroup会在一下两种状况下判别是否阻遏作业actwebsocket服务器ionMas动画专业ked == MotionEvent.ACTION_DOWN || mFirstTouchTarget != null。首要ACTION_DOWN作业是每次作业序列的起点,针Android对DOWN作业都会进行状况的重置。mFirstTouchTarget是什么呢?当作业由view的子元素成功处理时,mFirstTouchTarget就会被赋值并指向子元素,也便是说ViewGroup不阻遏作业并交由子元素处理时,mFirstTouchTarget!=null,假定ViewGroup阻遏了作业websocket心跳重连机制,那么mFirstTouchTarget就会为null,当MOVE作业或许UP作业到来时,源码因为mFiwebsocket心跳重连机制rstTouchTarget为nwebsocket协议ull,导致ViewGroup的onInterceptTouchEvent就不会被调用,并且这一序列的作业都交给它进行处理。

private static final class Touwebsocket和socket差异chTargewebsocket菜鸟教程t {
public View child;
public int powebsocket菜鸟教程interIdBits;
public TouchTargetAndroid next;
private TouchTarget() {
}
}

能够看到TouchTarget是一个链表结构,通过addTouchTarget办法对其进行赋值操作。

private TouchTarget addTouchTarget(@NonNull View child, int pointerI链表排序dBits) {
fin源码是什么意思al TouchTarget target = TouchTarget.obtainwebsocket协议(child, pointerIdBits);
target.next = mFirstTouchTarget;
mFirstTouchTarget = target;
return target;
}

而这个链表在没有多点触控的状况下,会退化成单个TouchTargetwebsocket和socket差异方针,多点触控下,方针相同相同为单个Touch链表排序Target方针,只是保存了多个pointerId信息,当方针不一起,才是链表结构。

回到之前的判别中,看到AndroidFLAG_DISALLOW_INTERCEPT这个符号位,这个符号位是通过requestDisallowInterceptTouchEvent办法进行设置的,一般在字view中进行调用,一旦进行设置后,ViewGroup将无法阻动画制造软件挠除了DOWN作业之外的其他作业。这也是处理滑动抵触中常用的办法之一。

通过以上的代码能够判别:当Vi源码年代训练怎么样ewGroup决议阻遏作业时,后续的点击作业将会默许的交给它处理并且不再调用它的onInterceptTouchEvent办法。

当ViewGr源码年代训练怎么样oup不阻遏作业时,作业将会向下分发交给其子vi链表c言语ew进行处理,代码如下:

public boolean dispatchTouchEvent(MotionEvent ev) {
...
boolean alreadyDispatchedToNewTouchTarget = false;
//不阻遏作业进入以下判别
if (!canceled &aWebSocketmp;& !in动画片小猪佩奇tercepted) {
...
//不链表是线性结构吗阻遏时,源码资源站作业会向下分发交由它的子view进行处理
final View[] children = mChildren;
//遍历源码本钱一切子元素
for (int i = childrenCount - 1;websocket心跳重连机制 i >= 0; i--) {
final inwebsocket是什么意思t childIndex = getAndVerifyPreorderedIndex(
childrenCount, i, customOrder);
final View child动画 = getAndVerifyPreorderedView(
preorderedList, childre链表c言语n, childIndex);
if (childWiandroid/yunosthAccessibilityFocus != null) {
if (childWithAccessibilandroid下载ityFocus != child) {
continue;
}
childWithAc源码之家cessibilityFocus = null;
i = childrenCwebsocket协议ount - 1;
}
//判别接触点方位是否在子view的点击范动画动画电影内或许是否在播放动画android体系
if (!canVi源码交易平台ew源码是什么意思ReceivePointerEvents(child)
|| !isTransformedTouchPointInView源码交易平台(x, y, child, null)) {
ev.setTargetAccessibilityFocus(false);
continue;
}
newTouchTargeandroid的drawable类t = getTouchTarget(child);
if (newTouchTarget != null) {
// Child i链表结构s already receiving touch within its bounds.
// Give it the new pointer in addition to the ones源码是什么意思 it is handling.
newTouchTarget.pointerIdBits |= i链表结构dBitsToAssign链表;
1.                             break;
}
resetCancelNextUpFlag(child)动画电影;动画专业
//将作业传递给子元素处理,dispatchTransformedTouchEvent实际上便是调用子元素的dispatchTouchEvent
if (dispatchTransformedTou动画大放映chEvent(ev, false, child, idBitsToAssign)) {android什么意思
// Child wants to receive touch within its bounds.
mLastTouchDownTime = ev.getDownTime();
if (preorderedList != null) {
// childIndex points into presorted list, find original ind链表数据结构ex
for (int j = 0; j &websocket的缺陷和缺乏lt; childrenCount; j++) {
if (children[childIndex] == mChildren[j]) {
mLastTouchDownIndex = j;
break;
}
}
} else {
mLastT动画片猫和老鼠ouchDownIndex = childIndex;
}
mLastTouchDownX = ev.getX();
mLastTouchDownY = ev.getY();
newTouchTar动画片汪汪队get = addTouchTarget(child, idBitsToAssign);
alreadyDispatchedToN动画制造软件ewTouchTarget = true;
break;
}
...
}

首要遍历ViewGroup的一切子元素,然后判android体系别子元素是否能够接纳点击源码是什么意思作业:是否在android/yunos播放动画,坐标是否落在子元素的区域内。假定满足这两个条件,那么作业就会传递给他处理。dispatchTransformedTouchEvenandroid下载t办法实际上便是调用子元素的dispatchTouchEvent办法。

pri链表排序vate boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel,
Vie源码编辑器手机版下载w child, int desiredPointerIdBits) {
final boolean handled;
...
final int oldAction = ev源码ent.getAction();
if (cance动画制造软件l || oldAction == MotionEvent.ACTION_CANCEL) {
ev链表ent.setAction(MotionEvent.ACTION_CANCEL);
if (child == null)链表排序 {
handled = super.dispatchTouchEvent(event);
} else {
handled = child.dispatchTouchEvent(event);
}
event动画图片头像.setAction(oldAction);
return handled;
}
.源码..
}

假定子元素的dispatchTouchEvent回来true, mFirstTouchTarget就会被赋值,

newTouchTarget = addTouchTarget(child, idBitsToAssigwebsocket菜鸟教程n);
alreadyDispatchedToNewTouchTarget = true;
break;

一起跳出循环,中止了对子元素的遍历,假定子元素的dispatchTouchEvent回来false,ViewGroup就会把作业分发给下一个子元素。

假定遍历一切的子元素后源码编辑器作业都没有被适宜的处理,有两种状况:第一种,Vie链表是线性结构吗wGroup没有子元素,第二种便是其子元素的dispatchTouchEvent回来了false。这两种状况ViewGroupandroid是什么手机牌子都会自己处理作业

if (mFirstTouchTarget == null链表和数组的差异) {
// No touchAndroid targets so treat this as an ordinary view.
handled = dispatchTransformedTouchEvent(ev, canceled, null,
TouchTarget.ALL_动画片猫和老鼠POINTER_IDS);
}

这次调用dispatchTransformedTouc链表c言语hEvent办法时,第三个参数child为null,在dispatchTransformedTouchEvent内部会直源码编辑器接调用super.dispatchTouchEvent(event),这儿就转动画片少儿小猪佩奇移到View的dispatchTouchEvent办法,点击作业就交个view处理了。

View

首要看View的dispatch动画图片头像TouchEvent办法

public boolean dispatchTouchEvent(Mot动画制造软件ionEvent event) {
...
boolean result = false;
...
if (onFilterTouchEwebsocket面试题vent动画片小猪佩奇ForSecuri源码年代训练怎么样ty(event)) {
if ((mViewFlags & ENABLED_MASK) == ENABLED && h动画专业andleScrollBarDragging(event)) {
result = tru动画大放映e;
}
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (m动画大放映ViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(android下载安装this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
}
...
retu动画专业rn result;
}

View是一个单独的元素,没有子元素,因链表排序此无法向下传递作业,只需自己处理作业。首要会判别有没有设置onTouchListandroid是什么手机牌子ener,假定OnTouchListener中的onToucandroid的drawable类h办法回来tandroid是什么手机牌子rue,那么onTouchEvent办法就不会被调用。

再来看一下onTouchE动画头像veWebSocketnt办法websocket面试题

public boolean onTouchEvent(MotionEvent event) {
final f链表是线性结构吗l源码编辑器oat x = evenandroid体系t.getX();
final float y = event.getY();
final int viewFlags = mViewFlags;
fina动画片小猪佩奇l int acandroid下载tiandroid下载安装on = event.getAction();
final boolean clickable = ((viewFlags & CLICKABLE) == CLICKABLE
|| (view动画电影Flags & LONG_CLICKABLE) == LONG_CLICKABLE)
|| (viewFlags & CONTEXT_CLICKAB动画片汪汪队LE源码) == CONTEXT_CLICKABLE;
...
if (clic链表结构kablwebsocket心跳重连机制e || (viewFlags & TOOLTIP) == TOOLTIP)websocket完成1对1谈天 {
switch (action) {
case MotionEvent.ACTI源码交易平台ON_UP:
...
if (!mHasPerformewebsocket服务器dLongPress && !mIgnoreNextUpEvent) {动画电影
// This is a tap, so re动画move the longpress check
removeLongPressCallbackandroid什么意思();链表数据结构
// Only perform take click actions if we were in the pressed state
if (!focusTaken) {
if (mPerformClick == nullwebsocket服务器) {websocket心跳重连机制
mPerformClick = new PerformClicandroid电子市场k();
}
if (!动画post(mPerfor链表排序mClick源码交易平台)) {
performClickInternal();
}
}
}
...
}
mIgnoreNextUpEwebsocket心跳重连机制vent = fals源码年代e;
break;
...
}
return true;
}
return false;
}

只需View的C源码资源站LICKABLE和LONG_CLICKABLE有一个为true,那么它就会消耗这个工源码年代作,onTouchEvent办法就会动画头像回来true,当ACTI链表ON_UP工android/yunos作产生时,会触发performClick办法,假定设置了OnClickListener,那么这个办法就会调用OnClick方WebSocket法。

作业分发小结

到这儿ViewGroup和View的时间分发就说源码年代训练怎么样完了,ViewGroup作业传递的递归调用就类似于一条职责链,一websocket心跳重连机制旦找到职责者,那WebSocket么将由职责者持有并消费这个作业。否则将作业持续传递给其他职责者。

总结

职责链方法让编程更具有活络性,WebSocket咱们能够看到不仅在Anwebsocket完成1对1谈天droid的源码中有运用到职责链,链表和数组的差异在许多的框架中也会运用,完毕这种链表的结构能够有多种办法,能够直接将处理者扔到链表中,也能够运用递归的方法进行作业的传递,面临不同的场景,活络的运用,才华发挥其强大的威力。

发表评论

提供最优质的资源集合

立即查看 了解详情