Android基础学习(一)——回调
先复习下回调的定义:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
(以上出自百度百科)
在java中的回调,通俗点讲,就是通过一个接口C连接类A和类B,类B可以实例化一个接口C当做变量,传给类A,A执行接口C中已经被B填充完整了的方法。
一般分三步分来实现一个回调的Demo:
1. 写一个接口(这个Demo通过的是Button的点击事件来实现,接口命名为MyListener)。
package com.example.callbackdemo;
public interface MyListener {
public void myClick();
}
接口中未实现的myClick()方法是接口实例化时需要补充实现的。
2. 继承Button控件(这个类也就是上文提到的类A)
package com.example.callbackdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
public class MyButton extends Button {
public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
MyListener myListener;
public MyButton(Context context) {
super(context);
}
//在setOnClickListener方法中将MyListener当做变量传入此类中
public void setOnClickListener(MyListener myListener) {
this.myListener = myListener;
}
//复写onTouchEvent方法,点击这个Button时会走此方法
@Override
public boolean onTouchEvent(MotionEvent event) {
myListener.myClick();//将MyListener需要实行的方法调用
return super.onTouchEvent(event);
}
}
3. 在主界面调用Button点击事件(这个类也就是上文提到的类B)
package com.example.callbackdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
private MyButton testCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testCallback = (MyButton) findViewById(R.id.bt_callback);
//调用MyButton的setOnClickListener方法将实例化的接口传入
testCallback.setOnClickListener(new MyListener() {
@Override
public void myClick() {
//这里填补我们需要执行的方法,让MyButton调用
Toast.makeText(getApplicationContext(), "测试回调", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
以下是Layout文件代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.callbackdemo.MainActivity" >
<com.example.callbackdemo.MyButton
android:id="@+id/bt_callback"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试回调"
android:layout_centerInParent="true"
/>
</RelativeLayout>
然后运行~~点击界面上的按钮,我们可以看到界面上显示我们的测试回调的Toast!
以下是回调总结的思维导图(刚开始写博客,还不会在博客中添加工程文件):
梳理一下流程:
我们在B类(MainActivity)中将接口C(MyListener)的实例化传入A类(MyButton)中,在实例化过程中将我们需要A类来执行的方法代码(也就是那个显示“测试回调”的Toast)填充进接口C,A类在触发调用接口C的方法(MyButton的点击事件)后,执行我们在B类中实例化填充进C的方法(Toast)。这就是回调,A执行了B中实例化接口时填充的方法。
小弟是新手,刚开始学习Android写博客,表述不清的话大家多多包涵提提意见哈,严格来说,回调应该不属于Android的基础知识,而是属于java的,不过最近复习回调的时候是通过调用Android的控件来展示,所以顺便总结在Android的笔记中吧~