IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 接口回调与方法回调 -> 正文阅读

[移动开发]接口回调与方法回调

1.1 接口回调

简介:
笔者查阅了大量资料,接口回调没有定义,可以理解为是一种设计思想。

什么是方法回调?

是将功能定义与功能分开的一种手段,一种解耦合的设计思想;
在Java中回调是通过接口来实现的,。不同的用户调用同一种方法可以满足其对应的不用需求。

例子:

有狗,猫,鸟三种动物,需要调用一个名为Animal 接口的call()方法。建立了三个类 dog类,cat类,bird类都实现Animal接口,且call()方法都不相同。现在三个类对应的三个实体都调用了接口的call()方法,需要让其实现不同的叫声。

代码实现:

public interface Animal {
	public void call();
}
public class Dog implements Animal{
    @override
    public void call(){
        //这里是Dog自己对接口方法的实现
    	... 
      	...
    }
}
public class Cat implements Animal{
    @override
    public void call(){
    	//这里是Cat自己对接口方法的实现
        ...
        ...
    }
}
public class Bird implements Animal{
    @override
    public void call(){
    	//这里是Bird自己对接口方法的实现
        ...
        ...
    }
}
public class Deal{
    public void doSth(Animal animal){
    	animal.call();//此步骤需要用到接口animal的功能
    	//处理其他事务
        ... ...
    }
}
//类Deal中用到了接口animal的功能,但是在定义时无法确定是哪一个实现Animal的子类,直接使用了接口Animal的句柄“Animal animal”,然后调用father的方法call()来处理,具体运行是再根据实例化对象调用相应的实现方法:
public static void main(String[] args){
    Deal deal = new Deal();
    Animal animalA = new Dog();
    Animal animalB = new Cat();
    Animal animalC = new Bird();
    deal.doSth(animalA);//调用的是animalA对接口的实现
    deal.doSth(animalB);//调用的是animalB对接口的实现
    deal.doSth(animalC);//调用的是animalB对接口的实现
}

这就达到了具体实现与事务处理的解耦。在类Deal处理事务过程中不需要知道实现接口的子类,这样可以方便的扩充和维护代码,即设计模式的开闭原则(对扩展开放,对修改关闭)。上面的代码中,animalA、animalB、animalC都可以称为接口回调对象,它们虽然被声明为接口Animal类型,但是在实例化时却是实现的某个子类。

1.2 Android回调的事件处理机制详解

在Android中基于回调的事件处理机制使用场景有两个:

转载自:https://www.runoob.com/w3cnote/android-tutorial-callback-event-handle.html

1.2.1自定义view

当用户在GUI组件上激发某个事件时,组件有自己特定的方法会负责处理该事件 。

通常用法:

  1. 继承基本的GUI组件。
  2. 重写该组件的事件处理方法,即自定义view 。
    注意:在xml布局中使用自定义的view时,需要使用"全限定类名"

实现代码: MyButton.java

public class MyButton extends Button{  
    private static String TAG = "呵呵";  
    public MyButton(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    //重写键盘按下触发的事件  
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        super.onKeyDown(keyCode,event);  
        Log.i(TAG, "onKeyDown方法被调用");  
        return true;  
    }  
  
    //重写弹起键盘触发的事件  
    @Override  
    public boolean onKeyUp(int keyCode, KeyEvent event) {  
        super.onKeyUp(keyCode,event);  
        Log.i(TAG,"onKeyUp方法被调用");  
        return true;  
    }  
  
    //组件被触摸了  
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        super.onTouchEvent(event);  
        Log.i(TAG,"onTouchEvent方法被调用");  
        return true;  
    }  
} 

布局文件:

<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"  
    tools:context=".MyActivity">  
    
    <example.jay.com.mybutton.MyButton  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="按钮"/> 

代码解析:

因为我们直接重写了Button的三个回调方法,当发生点击事件后就不需要我们在Java文件中进行 事件监听器的绑定就可以完成回调,即组件会处理对应的事件,即事件由事件源(组件)自身处理!

1.2.2基于回调的事件传播

img

综上,就是如果是否向外传播取决于方法的返回值是时true还是false;

代码示例:

public class MyButton extends Button{  
    private static String TAG = "呵呵";  
    public MyButton(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    //重写键盘按下触发的事件  
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        super.onKeyDown(keyCode,event);  
        Log.i(TAG, "自定义按钮的onKeyDown方法被调用");  
        return false;  
    }  
}

main.xml:

<LinearLayout 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"  
    tools:context=".MyActivity">  
  
    <example.jay.com.mybutton.MyButton  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="自定义按钮"  
        android:id="@+id/btn_my"/>  
</LinearLayout>  

MainActivity.java:

public class MyActivity extends ActionBarActivity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_my);  
  
        Button btn = (Button)findViewById(R.id.btn_my);  
        btn.setOnKeyListener(new View.OnKeyListener() {  
            @Override  
            public boolean onKey(View v, int keyCode, KeyEvent event) {  
                if(event.getAction() == KeyEvent.ACTION_DOWN)  
                {  
                    Log.i("呵呵","监听器的onKeyDown方法被调用");  
                }  
                return false;  
            }  
        });  
    }  
  
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        super.onKeyDown(keyCode, event);  
        Log.i("呵呵","Activity的onKeyDown方法被调用");  
        return false;  
    }  
} 

运行截图:

img

结果分析: 从上面的运行结果,我们就可以知道,传播的顺序是: 监听器—>view组件的回调方法—>Activity的回调方法了;

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:36:39  更:2022-03-30 18:38:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:49:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码