Android 自己打造IOC注解框架

注解&反射(三)【实战--Android View IOC框架的两种实现方案】 控制反转(Inversion of Control,英文缩写为IoC),把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。 说完概念定义,IOC好像就是把new 对象的权利交由框架去实现,这样Java代码中就不必要那么多的new操作了。仅此而已吗?NO、NO、NO,Android中我们经常会使用BindView框架,为什么使用它呢?因为它让我们省去了很多findVi. 阅读详情
Android中IOC框架就是注入控件和布局或者说是设置点击监听,网上有很多成熟的注解框架例如xUtils,afinal,butterknife等等。你可能会问,既然已经有好的框架为何还要造轮子?因为,首先我是学习,学习框架的设计以及实现,其次是拓展,适合自己的轮子才是好轮子,所以我添加了判断网络状态的注解。此处特别感谢辉哥,他的技术分享是我的楷模。

首先看看最终完成的效果

public class MainActivity extends AppCompatActivity {

    @ViewById(R.id.tv_hello)
    private TextView tv_hello;

    @ViewById(R.id.iv_img)
    private ImageView iv_img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewUtils.inject(this);
        tv_hello.setText("你好,IOC");
    }

    @OnClick({R.id.tv_hello, R.id.iv_img})
    @CheckNet
    private void sayHello(){
        Toast.makeText(this, tv_hello.getText().toString(), Toast.LENGTH_SHORT).show();
    }

}

运行效果
有网和无网状态

有网状态下,可以正常点击然后提示,无网状态下提示网络的问题。

下面看看具体实现
我阅读了xUtils和butterknife的源码,xUtils使用有点麻烦,butterknife的定义(变量,方法等)只能是public,所以我结合两者,造出适合自己的,习惯是private定义,以及追求使用方便。

首先要了解一下反射机制,不懂的话百度一下
好。coding
属性注入 : 利用反射去 获取Annotation –> value –> findViewById –> 反射注入属性
事件注入 :利用反射去 获取Annotation –> value –> findViewById –> setOnclickListener –> 动态代理反射执行方法

新建一个Module,添加以下的类

View注解的Annotation

/**
 * @creation_time: 2017/5/7
 * @author: Vegen
 * @e-mail: vegenhu@163.com
 * @describe: View注解的Annotation
 */
//@Target(ElementType.FIELD) 代表Annotation的位置  FIELD代表属性 TYPE类上  CONSTRUCTOR构造函数上  METHOD方法上面
@Target(ElementType.FIELD)
//@Retention(RetentionPolicy.CLASS) 什么时候生效 CLASS代表编译时 RUNTIME运行时 SOURCE源码资源
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewById {
    //@ViewById(R.id,xxx)
    int value();
}

View辅助类

/**
 * @creation_time: 2017/5/7
 * @author: Vegen
 * @e-mail: vegenhu@163.com
 * @describe: View辅助类
 */

public class ViewFinder {
    private Activity activity;
    private View view;

    public ViewFinder(Activity activity) {
        this.activity = activity;
    }

    public ViewFinder(View view) {
        this.view = view;
    }

    public View findViewById(int viewId){
        return activity != null ? activity.findViewById(viewId) : view.findViewById(viewId);
    }
}

View工具类

/**
 * @creation_time: 2017/5/7
 * @author: Vegen
 * @e-mail: vegenhu@163.com
 * @describe: View工具类
 */

public class ViewUtils {
    public static void inject(Activity activity){
        inject(new ViewFinder(activity), activity);
    }
    public static void inject(View view){
        inject(new ViewFinder(view), view);
    }
    public static void inject(View view, Object object){
        inject(new ViewFinder(view), object);
    }
    // 兼容上面三个方法   object是反射需要执行的类
    public static void inject(ViewFinder finder, Object object){
        // 注入属性
        injectFile(finder, object);
        // 注入事件
        injectEvent(finder, object);
    }

    /**
     * 事件注入
     * @param finder
     * @param object
     */
    private static void injectEvent(ViewFinder finder, Object object) {
        // 1、获取类的所有方法
        Class<?> clazz = object.getClass();
        Method[] methods = clazz.getDeclaredMethods();
        // 2、获取OnClick里面的value值
        for (Method method : methods){
            OnClick onClick = method.getAnnotation(OnClick.class);
            if (onClick != null){
                int[] viewIds = onClick.value();
                for (int viewId : viewIds){
                    // 3、findViewById找到View
                    View view = finder.findViewById(viewId);

                    //拓展功能 检测网络
                    boolean isCheckNet = method.getAnnotation(CheckNet.class) != null;

                    if (view != null){
                        // 4、setOnClickListener
                        view.setOnClickListener(new DeclaredOnClickListener(method, object, isCheckNet));
                    }
                }
            }
        }
    }

    private static class DeclaredOnClickListener implements View.OnClickListener{

        private Object mObject;
        private Method mMethod;
        private boolean mIsCheckNet;

        public DeclaredOnClickListener(Method method, Object object, boolean isCheckNet) {
            this.mMethod = method;
            this.mObject = object;
            this.mIsCheckNet = isCheckNet;
        }

        @Override
        public void onClick(View view) {
            //判断是否需要检测网络
            if (mIsCheckNet){
                //需要
                if (!isNetConnected(view.getContext())){
                    Toast.makeText(view.getContext(), "请检查网络,请稍后重试", Toast.LENGTH_SHORT).show();
                    return;
                }
            }

            //点击会调用该方法
            try {
                // 所有方法都可以 包括私有公有
                mMethod.setAccessible(true);
                // 5、反射注入执行方法
                mMethod.invoke(mObject, view);
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    mMethod.invoke(mObject, null);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

    /**
     * 检测手机数据是否可用
     */
    public static boolean isMobileNetConnected(Context context){
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
        return cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected();
    }

    /**
     * 检测WIFI是否开启可用
     */
    public static boolean isWifiNetConnected(Context context){
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
        return cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected();
    }

    /**
     * 检测网络是否可用
     */
    public static boolean isNetConnected(Context context){
        return isMobileNetConnected(context) || isWifiNetConnected(context);
    }

    /**
     * 注入属性
     * @param finder
     * @param object
     */
    private static void injectFile(ViewFinder finder, Object object) {
        // 1、获取类里面的所有的属性
        Class<?> clazz = object.getClass();
        // 获取所有属性包括私有和公有
        Field[] fields = clazz.getDeclaredFields();

        // 2、获取ViewById里面的value值
        for (Field field : fields){
            ViewById viewById = field.getAnnotation(ViewById.class);
            if (viewById != null){
                // 获取注解里面的id值
                int viewId = viewById.value();

                // 3、findViewById找到View
                View view = finder.findViewById(viewId);
                if (view != null) {
                    // 能够注入所有的修饰符 private public
                    field.setAccessible(true);

                    // 4、动态注入找到的View
                    try {
                        field.set(object, view);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }



    }
}

View 事件注解的Annotation

/**
 * @creation_time: 2017/5/7
 * @author: Vegen
 * @e-mail: vegenhu@163.com
 * @describe: View 事件注解的Annotation
 */
//@Target(ElementType.FIELD) 代表Annotation的位置  FIELD代表属性 TYPE类上  CONSTRUCTOR构造函数上  METHOD方法上面
@Target(ElementType.METHOD)
//@Retention(RetentionPolicy.CLASS) 什么时候生效 CLASS代表编译时 RUNTIME运行时 SOURCE源码资源
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClick {
    //@ViewById(R.id,xxx)
    int[] value();
}

View 网络状态注解的Annotation

/**
 * @creation_time: 2017/5/7
 * @author: Vegen
 * @e-mail: vegenhu@163.com
 * @describe: View 网络状态注解的Annotation
 */
//@Target(ElementType.FIELD) 代表Annotation的位置  FIELD代表属性 TYPE类上  CONSTRUCTOR构造函数上  METHOD方法上面
@Target(ElementType.METHOD)
//@Retention(RetentionPolicy.CLASS) 什么时候生效 CLASS代表编译时 RUNTIME运行时 SOURCE源码资源
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckNet {
}

好,到此为止已经完成注解框架了,下面看看使用
MainActivity

public class MainActivity extends AppCompatActivity {

    @ViewById(R.id.tv_hello)
    private TextView tv_hello;

    @ViewById(R.id.iv_img)
    private ImageView iv_img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewUtils.inject(this);
        tv_hello.setText("你好,IOC");
    }

    @OnClick({R.id.tv_hello, R.id.iv_img})
    @CheckNet
    //方法名随意
    private void sayHello(){
        Toast.makeText(this, tv_hello.getText().toString(), Toast.LENGTH_SHORT).show();
    }

}

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.vegen.study.ioctest.MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/iv_img"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"/>

</LinearLayout>

别忘了添加网络访问权限

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

具体代码以及demo已经开源到我的github,欢迎star,有问题交流一下,地址:Vegen的github

从压电传感器到示波器:手把手教你用CA3140搭建电荷放大器(含PCB布局与调零技巧) 本文详细介绍了如何使用CA3140运算放大器搭建专业级电荷放大器,从压电传感器信号特性分析到PCB布局与调零技巧,全程实战演示。重点解析了CA3140的低通滤波器设计、反馈网络参数计算及抗干扰增强方案,帮助电子爱好者高效实现微弱电荷信号的稳定转换与测量。 阅读详情

相关推荐

STM32G4实战:用CubeMX+Keil五分钟搞定FreeRTOS多任务LED控制(避坑指南)

本文详细介绍了如何在STM32G4系列芯片上使用CubeMX和Keil快速配置FreeRTOS实现多任务LED控制,包括环境准备、时钟配置、任务创建及常见问题解决方案。重点解决了时钟源冲突等高频问题,并提供了优化建议和进阶应用示例,帮助开发者高效完成嵌入式开发任务。

joy55的博客 223

Android进阶项目01-打造一套IOC注解框架

打造一套IOC注解框架,再也不用findViewById了

convex1009848621的博客 426

Windows非分页缓冲池内存泄漏实战:PoolMon与RAMMap高效排查指南

本文详细介绍了Windows系统中非分页缓冲池内存泄漏的实战排查方法。当系统出现卡顿且内存占用异常增长时,通过RAMMap工具快速定位非分页缓冲池异常,并利用PoolMon监控内核内存分配标签,精准锁定泄漏源。文章提供了从确认症状、安装工具到使用findstr命令溯源驱动文件的完整五步排查流程,并总结了常见泄漏标签与解决方案,帮助用户高效解决深层系统内存问题。

weixin_28455801的博客 1011

Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】

那我们该怎么做才能做到年薪60万+呢,对于程序员来说,只有不断学习,不断提升自己的实力。我之前有篇文章提到过,感兴趣的可以看看,到底要学习哪些知识才能达到年薪60万+。通过职友集数据可以查看,以北京 Android 相关岗位为例,其中 【20k-30k】 薪酬的 Android 工程师,占到了整体从业者的 30.8%!北京 Android 工程师「工资收入水平 」今天重点内容是怎么去学,怎么提高自己的技术。1.合理安排时间2.找对好的系统的学习资料3.有老师带,可以随时解决问题。

2301_79098332的博客 1005

STM32使用LORA模块通信

目录 一、模块使用方法 1、模块简介 2、硬件及功能 3、传输方式 二、模块上手 1、连接 2、编写代码 usart3.h usart3.c lora.h lora.c 一、模块使用方法 本文以正点原子ATK-LORA-01模块为例进行介绍。 1、模块简介 ATK-LORA-01-V3.0(V3.0是版本号,下面均以ATK-LORA-01表示该产品)是ALIENTEK推出的一款体积小、微功率、低功耗、高性能远距离LORA无线串口模块。模块设计是采用高效的IS...

qq_54706971的博客 3万+

FastAdmin框架Token验证实战:从登录到API调用的完整流程

本文详细解析了在FastAdmin框架中实现Token验证的完整流程,从数据表设计、登录接口签发Token,到核心验证中间件的编写与路由配置,并探讨了在业务API中的调用与安全实践。内容涵盖Token生成策略、有效期管理及安全增强措施,为开发者提供了一套可落地的API身份验证解决方案。

nnn11的博客 916

Android IOC框架的实现原理

1. IOC思想 先看一个简单的例子: 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。例如下面类 Human 中用到一个 Father 对象,我们就说类 Human 对类 Father 有一个依赖。 public class Human { ... Father father; ... public Human() { father = new Father(); } } 仔细看这段

汉堡怪兽 2164

从零实现反激式电源仿真:LTspice高级应用实例

深入解析反激式开关电源的建模与仿真过程,利用LTspice实现从零搭建电路,精准验证电路仿真效果,提升电源设计效率与可靠性。

weixin_36149538的博客 1896

Androi中IOC(控制反转)理解

我们先看,IOC是什么,g

shenhualxt111的专栏 627

道路缺陷检测实战指南:基于YOLOv11的深度学习系统从搭建到落地

道路缺陷检测项目的每一步,都是“理论→实践→反思→优化”的成长循环。当你看到自己开发的系统能精准识别出道路上的每一处裂缝、每一个坑洼时,那种“技术解决真实问题”的成就感,会让你明白深度学习不止是论文里的公式,更是改变行业的工具。如果过程中遇到模型不收敛、界面功能异常等问题,不妨把问题拆解成“数据是否标注准确?”“模型参数是否合理?”“界面逻辑是否有漏洞?”等小问题逐一排查。记住,每解决一个问题,你就离“能独立落地AI项目的工程师”更近一步。

LXY_LOVE36的博客 171

K8s-K8s部署Zookeeper+Kafka+ELFK+持久化数据

K8s环境下容器化部署`Zookeeper+Kafka+ELFK`日志收集系统

✅ 专注企业级 Linux/DevOps 运维的实战派 ✅ 已输出上百篇可落地方案 ✅ Shell 脚本开箱即用 ✅ K8s/YAML 环境验证 ✅ 故障排查链路完整复现 1914

Android中使用注解打造自己的IOC框架

一、采用注解来注入Activity中的布局和控件: a、了解注解-Annotation i、注解是程序中的一种标记也叫做元数据,在程序中加上注解相当于为程序打上某种标记。 详细了解注解:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

Refrain飞的博客 440

高通开发系列 - Linux/Ubuntu移植到QCS8xxx平台

QCS8250和QRB5165平台属于体系架构相同的芯片,前置是带cellular而后者不带,即前置有移动网络而后者没有。 BSP部分的软件内容有差异需要修改外,同一套代码编译出来的执行程序是可以运行的,不会存在体系架构、指令集不匹配的问题。 QCS8250平台没有Linux/Ubuntu的软件SDK,只有Android的SDK,但是它对应j兼容的QRB5165平台有LE(Linux)和Ubun(Ubuntu)SDK。所以我们需要做的就是用QRB5165 Linux/Ubuntu移植到QCS8250平台上来

fulinux的博客 3186

自己动手打造一套IOC注解框架

1.概述  这是我们的内涵段子系统架构的第一期分享,希望大家可以先去了解一下这一期的内容:2017Android进阶之路与你同行。在介绍内涵段子整个项目的时候我们也说好了会分析系统源码设计模式,第三方框架源码解析,然后自己动手一点一点打造一套内涵段子框架。这一期的内容对于部分哥们可能有点麻烦,如果觉得抽象请看视频讲解。   那么什么是IOC,控制反转(Inversion of Control,英文

z240336124的专栏 1656

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

10、afinal logoAndroid的快速开发框架 afinal

Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架。同时封装了android中的http框架,使其更加简单易用;使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题。Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。 目前Afinal主

zwcshy的专栏 403

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android 常用ioc框架,Android进阶——框架之IOC框架

什么是IOCIOC(Inversion of Control):控制反转。开发过程中类里面需要用到很多个成员变量传统的写法:你要用这些成员变量的时候,那么你就new出来用IOC的写法:你要用这些成员变量的时候,使用注解的方式自动注入进去优点:代码量减少,加速开发缺点:性能消耗加大,阅读性差,加速65535框架的思路框架例子//实现Button自动findViewById的工作@ViewById(R...

weixin_36204061的博客 623

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

教你打造 Android 中的 IOC 框架

1、概述 首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量,那么你就new 出来用呗~~ IoC的原则是:NO,我们不要new,这样耦合度太高;你配置个xml文件,里面标明哪个类,里面用了哪些成员变量,等待加载这个类的时候,我帮你注入(new

xyjikl 605

控制反转-IoC

控制反转(Inversion of Control,缩写为IoC),是指原来由程序代码中主动获取的资源,转变为由第三方获取并使原来的代码被动接收的方式,以达到解耦的效果。

kayyoo的博客 1206

Android IOC思想入门与实战

什么是 IOC : 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引...

Lud的博客 489

android ioc框架,Android IOC注入框架设计

什么是IOC官方:控制反转(Inversion of Control,缩写为IoC),是[面向对象编程] 中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用...

weixin_39622891的博客 234

Android高级-揭秘IOC框架

什么是DIP ,IOC,DI,IOC容器 DIP Dependency inverse Principle 依赖倒置原则 强调系统的“高层组件”不应当依赖于“底层组件”,并且不论是“高层组件”还是“底层组件”都应当依赖于抽象, 抽象不应当依赖于实现,实现应当依赖于抽象(软件设计原则) IOC Invrse of Control 控制反转 一种反转刘,依赖和接口的方式,就是将控制权“往高...

u013815832的博客 392

Android之IOC框架介绍

image.png 最近看开源代码,发现有这么一句: @ViewInject(id = R.id.mIvGRZX,click = true) private ImageView mIvGRZX; 就来调查下相关的技术原理。 不用慌, 它就等同于: findViewById IOC框架 Inversion of Control,英文缩写为IOC,字面翻译:控制反转。 就是一个类里面...

u012739527的博客 578

在Android中使用IOC框架让代码更清爽

很久很久以前,我们创建某件物品都是用双手在流水线上创建的,当我们有了机器后,这个机器就替代了人,帮助人创造物品,这个过程倒置了反转。在Android中,你获取控件,都需要自己手动获取,那么反转过来顾名思义就是程序自动获取控件。 相信在系统学习过Java Web的Spring框架的人对IOC应该一点也不陌生,那你们知道在Android中怎么应用吗,这可能设及的知识有点多,包括反射,Java注解类,设计模式之代理模式等知识。下面我将演示怎么运行IOC来获取控件,设置回调方法的应用。

李元静 8252

Android注解框架与自己实现类似ButterKnife效果解析

IOC是Inversion of Control(控制反转)的缩写,是一种设计模式,其核心思想是将对象的控制权转移给容器或框架,而不是在代码中直接实例化和管理对象。在这种模式中,对象的创建和组装由容器完成,而应用程序只需要定义对象需要的属性和依赖关系,容器会自动完成对象的创建和依赖注入。在本文中,我们将介绍一个简单的IOC框架,它基于注解,可以实现视图的自动绑定和事件的自动绑定。

liuhaikang的博客 290

IoC 在 Android 中的应用

控制反转 IoC(Inversion of Control) 意思是把创建对象的权利交给框架,是框架的重要特性,并非面向对象编程的专业术语。—-百度百科在 Java 开发...

Android技术之家 1064

Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (下

break;break;直接通过在Activity中的任何一个方法上,添加注解,完成1个或多个控件的事件的注入。这里我把onCreate搬到了BaseActivity中,里面调用了ViewInjectUtils.inject(this);2、实现====1、注解文件Class

2401_83620959的博客 825
上一篇: Android项目实践--《智慧校园》
下一篇: Android 权限整理
胡小明同学
博客等级 码龄10年 35粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值