回调机制

来源:互联网 发布:ios软件安装失败 编辑:程序博客网 时间:2024/06/08 00:20

为了方便理解就用最简单的同步回调:事件监听来理解

首先说一下同步的周期:

我们继承的listener就是一个回调的接口,首先我们创建自己的类A,然后让他继承回调的接口C(在这就是listener,这样类A就成了listener的子类了,我们就可以在类B中通过listener来定义得到类A)然后创建一个系统提供的类B(比如说button,其实他是View的子类),我们再在A中使用创建出来的类B调用B类(系统类)中已知的方法(setOnClickListener),参数是this(注意!this其实就是我们类A的一个函数指针,这样我们就可以在类B中明确的创建出类A),然后用A调用B中已知的一个方法(不难发现,这个方法在A中是没有入口的,其实这个方法是为类B提供用来回调的方法,比如说:onClick())

下面就是代码解析:

这里是接口C

public interface OnClickListener {      /**     * @param v The view that was clicked.      */      void onClick(View v);  }  
这里是类A
<pre name="code" class="html">public class MainActivity extends Activity implements OnClickListener{      //这里就是创建的类B     private Button button;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          button = (Button)findViewById(R.id.button1);                    //这里我们调用B类中的方法,目的其实是为了让B得到A的函数指针        button.setOnClickListener(this);      }        //这里就是回调方法,B可以通过得到的A的对象来调用这个方法    @Override      public void onClick(View v) {          System.Out.println("OnClick");      }    }  
<pre name="code" class="html">这里是系统类B:
这个函数是为了得到A的函数指针this的:
<pre name="code" class="html">public void setOnClickListener(OnClickListener l) {          if (!isClickable()) {              setClickable(true);          }          mOnClickListener = l;   }
这个函数是用来回调A中的onClick方法的

<pre name="code" class="html">public boolean performClick() {          sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);          if (mOnClickListener != null) {              playSoundEffect(SoundEffectConstants.CLICK);  
<span style="white-space:pre"></span>    //回调方法              mOnClickListener.onClick(this);              return true;          }          return false;  }  

0 0
原创粉丝点击