• Android 当中的 Fragment 协作解耦方式


    Android 当中的 Fragment 协作解耦方式

    第一章 前言介绍

    第01节 遇到的问题

    场景介绍:
    	1、在同一个项目开发过程中, 程序员A 和 程序员B 开发着不同的功能模块。
    	2、有一天需要程序员 A 和 程序员B 之间功能模块, 存在相互的调用关系。
    	3、但是这些功能尚未开发完毕, 还在进行中。
    
    问题来了:
    	1、在未开发完毕之前, 如何实现相互之间能够调用呢?
    	2、怎样才能保证功能的协作开发, 正确有效的完成呢?
    	
    试想场景:
    	1、如果程序员 A 直接创建了 程序员B 开发类的对象, 调用程序员B 的方法。
    	2、那么假设有一天程序员B 修改了其功能和操作, 那么程序员A 也被迫需要跟着修改。(依赖关系很强烈)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12



    第02节 绘图说明

    问题细节介绍

    在这里插入图片描述


    问题的解决方案

    在这里插入图片描述





    第二章 核心代码

    为了简单直击问题点,我们采用 Java 代码去模拟 Android 的一些基础环境。

    第01节 代理人接口

    // 定义中间衔接的接口
    public interface IServiceA2B {
    
        // 处理点击姓名的操作, 传递两个参数
        void handleClickName(int position, String message);
    
        // 处理点击头像的操作, 没有传递参数
        void handleClickAvert();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9



    第02节 中间人 Activity

    // 中间的 Activity 衔接人
    public class Activity {
    
        // 在初始化 Activity 的 onCreate() 方法的时候, 初始化两个 Fragment
        private FragmentA fragmentA;
        private FragmentB fragmentB;
    
        public void onCreate(){
            // 初始化两个 Fragment
            fragmentA = new FragmentA();
            fragmentB = new FragmentB();
    
            // 两个Fragment 都会持有 Activity的对象
            fragmentA.onCreateView(this);
            fragmentB.onCreateView(this);
        }
    
    
        // 定义中间衔接的接口, 该接口采用内部类的方式实现, 便于统一管理。
        // 如果存在多个 FragmentA.FragmentB.FragmentC.FragmentD...
        // 可以分别实现不同的接口方式
        private final IServiceA2B serviceA2B = new IServiceA2B() {
            @Override
            public void handleClickName(int position, String message) {
                fragmentB.showName(position, message);
            }
    
            @Override
            public void handleClickAvert() {
                fragmentB.showAvert();
            }
        };
    
        // 暴露出接口对象, 给事件发起者, 持有该接口, 通过接口去调用具体的实现。
        public IServiceA2B getServiceA2B() {
            return serviceA2B;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38



    第03节 开发者A

    事件的发起方。FragmentA

    
    // 总结: 对于事件的发起者, FragmentA 需要做的三件事情:
    // 1. 通过 Fragment 拿到 Activity 的对象。
    // 2. 通过 Activity 的对象, 拿到代理接口的对象 service
    // 3. 在处理点击事件的时候, 采用代理接口的对象, 去调用具体的方法
    public class FragmentA {
    
        private Activity activity;
    
        public void onCreateView(Activity activity){
            System.out.println("FragmentA.onCreateView");
            this.activity = activity;
    
            buttonClickAvert();
            buttonClickName(66, "张无忌");
        }
    
        private void buttonClickName(int position, String name) {
            System.out.println("FragmentA.buttonClickName");
            activity.getServiceA2B().handleClickName(position, name);
        }
    
        private void buttonClickAvert() {
            System.out.println("FragmentA.buttonClickAvert");
            activity.getServiceA2B().handleClickAvert();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27



    第04节 开发者B

    事件的接收方。FragmentB

    // 总结: 对于事件的接收者, FragmentB 需要做的三件事情:
    // 1. 自己的 Fragment 当中, 去定义接收到数据之后的实现展示的逻辑
    // 2. 在外部定义需要衔接的接口, 代理接口 IServiceXXX
    // 3. 在Activity 当中, 去定义接口的内部类实现。
    //      I.  接口实现的方法当中, 采用 FragmentB 的对象, 去调用 FragmentB 当中的方法
    //      II. 对外暴露出代理接口的对象, 也就是快捷键生产 getIServiceXXX 的对象, 让发送者持有代理接口对象。
    public class FragmentB {
    
        private Activity activity;
    
        public void onCreateView(Activity activity){
            System.out.println("FragmentB.onCreateView");
            this.activity = activity;
        }
    
        public void showAvert() {
            System.out.println("FragmentB.showAvert");
        }
    
        public void showName(int position, String name) {
            System.out.println("FragmentB.showName.position: " + position +", name: " + name);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24



    第05节 测试类

    模拟过程

    public class Main {
        public static void main(String[] args) {
            System.out.println("APP启动了...");
    
            Activity activity = new Activity();
            activity.onCreate();
    
            System.out.println("APP退出了....");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    最终运行的结果

    APP启动了...
    FragmentA.onCreateView
    FragmentA.buttonClickAvert
    FragmentB.showAvert
    FragmentA.buttonClickName
    FragmentB.showName.position: 66, name: 张无忌
    FragmentB.onCreateView
    APP退出了....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8






  • 相关阅读:
    Spring Boot对接RocketMQ示例
    MIT 6.858 计算机系统安全讲义 2014 秋季(二)
    LLM强势挺进端侧,AI大语言模型端侧部署如何影响超自动化?
    Python: 使用pytest进行代码测试
    [CM311-1A]-安卓设备视频分辨率 DPI 以及刷新率问题
    Qt Socket 通讯示例2
    python3 win环境部署
    直饮水表和智能水表有什么区别?
    软件测试面试(四)
    Python+requests+unittest执行接口自动化测试
  • 原文地址:https://blog.csdn.net/ShiShiLunHui/article/details/134472381