Android高级UI面试题汇总(含详细解析 十五)

安卓Android面试题汇总——超长15万字总结 本文介绍了Android开发中Activity与Fragment的通信方式,包括接口回调、Bundle传参、Handler、广播、EventBus和ViewModel等6种方法,分析了各自适用场景。接着讲解了Activity四种启动模式(standard、singleTop、singleTask、singleInstance)的特点和应用场景。最后对比了BroadcastReceiver和LocalBroadcastReceiver的区别,指出前者支持跨应用通信但性能较低,后者仅限应用内使用但更高效安全。 阅读详情

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇

View.inflater过程与异步inflater

这道题想考察什么?

考察同学对xml解析过程,以及异步解析过程,但是异步解析在使用过程中有诸多限制,所以使用的并不太多。

考生应该如何回答

Inflate解析

我们先分析一下View.inflate 的代码:

// View.java
public static View inflate(Context context, @LayoutRes int resource, ViewGroup root) {
    LayoutInflater factory = LayoutInflater.from(context);
    return factory.inflate(resource, root);
}

上面的代码不难发现是调用了LayoutInflater.inflate,于是我们将目光放到这个函数里面来

// LayoutInflater.java
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
    return inflate(resource, root, root != null);
}

public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
    final Resources res = getContext().getResources();

    // 获取资源解析器 XmlResourceParser
    XmlResourceParser parser = res.getLayout(resource);
    try {
        // 解析View
        return inflate(parser, root, attachToRoot);
    } finally {
        parser.close();
    }
}

public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
    synchronized (mConstructorArgs) {
        final Context inflaterContext = mContext;
        // 存储传进来的根布局
        View result = root;
        try {
            final String name = parser.getName();
            //解析 merge标签,rInflate方法会将 merge标签下面的所有子 view添加到根布局中
            // 这也是为什么 merge 标签可以简化布局的效果
            if (TAG_MERGE.equals(name)) {
                // 必须要有父布局,否则报错
                if (root == null || !attachToRoot) {
                    throw new InflateException("<merge /> can be used only with a valid "
                }
                // 解析 merge标签下的所有的 View,添加到根布局中
                rInflate(parser, root, inflaterContext, attrs, false);
            } else {
                // 获取 xml 布局的根 View 对象,比如 LinearLayout 对象,FrameLayout 对象等
                final View temp = createViewFromTag(root, name, inflaterContext, attrs);
                ViewGroup.LayoutParams params = null;
                // 第一种情况:root != null &&attachToRoot 为false,通过 root 来获取根节点的布局参数 ViewGroup.LayoutParams 对象,也就是说,把 xml 中的根节点的 layout_ 开头的属性,如layout_width 和 layout_height 对应的值转为布局参数对象中的字段值,如width 和 height 值
                if (root != null) {
					params = root.generateLayoutParams(attrs);
                    if (!attachToRoot) {
                        // 将 root 提供的 LayoutParams 设置给View
                        temp.setLayoutParams(params);
                    }
                }
                // 渲染子View
                rInflateChildren(parser, temp, attrs, true);
                // 第二种情况:root != null,且attachToRoot = true,新解析出来的 View 会被 add 到 root 中去,然后将 root 作为结果返回
                if (root != null && attachToRoot) {
                    root.addView(temp, params);
                }
                // 第三种情况:root == null,或者 attachToRoot = false,直接返回View,这意味着此时的temp没有解析xml中的layout属性
                if (root == null || !attachToRoot) {
                    result = temp;
                }
            }
        }
        // 返回result,可能是View,也可能是root
        return result;
    }
}

从上面的代码大家应该不难发现,inflate 主要是解析xml的属性,并生成xml的根布局temp,并且基于inflate的参数情况,来确定是否将temp添加到 解析它的 外层布局上面,也就是root变量上面。

inflate 的三个参数,其中第二和第三参数分下面几种情况:

  • 当 root != null 且 attachToRoot == false 时,新解析的 View 会直接作为结果返回,而且 root 会为新解析的 View 生成 LayoutParams 并设置到该 View 中去。
  • 当 root != null 且 attachToRoot == true 时,新解析出来的 View 会被 add 到 root 中去,然后将 root 作为结果返回。
  • 当 root == null 且 attachToRoot == false 时,新解析的 View 会直接作为结果返回,注意:此时的view是没有解析它xml中的layout params属性的,所以,xml中设置的宽高将可能失效。

接下来,我们分析一下createViewFromTag 源码

// LayoutInflater.java
private View createViewFromTag(View parent, String name, Context context, AttributeSet attrs) {
    return createViewFromTag(parent, name, context, attrs, false);
}

View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
                       boolean ignoreThemeAttr) {
    ...
    if (view == null) {
        if (-1 == name.indexOf('.')) {
            // 创建android sdk 的View,例如:LinearLayout、Button等,最终还是调用的createView
            view = onCreateView(context, parent, name, attrs);
        } else {
            // 创建 用户自定义View
            view = createView(context, name, null, attrs);
        }
    }
    ...
    return view;
}

从上面的函数我们发现他们主要是执行了onCreateView函数,那么onCreateView又做了什么呢?

public final View createView(@NonNull Context viewContext, @NonNull String name,
                             @Nullable String prefix, @Nullable AttributeSet attrs)
    throws ClassNotFoundException, InflateException {
    // 从缓存中获取constructor
    Constructor<? extends View> constructor = sConstructorMap.get(name);
    Class<? extends View> clazz = null;
    try {
        // 没有缓存,则创建
        if (constructor == null) {
            // 通过全类名获取 Class 对象,如果是sdk的View,需要拼接字符串
            clazz = Class.forName(prefix != null ? (prefix + name) : name, false,
                                  mContext.getClassLoader()).asSubclass(View.class);

            // 获取 Constructor 对象
            constructor = clazz.getConstructor(mConstructorSignature);
            constructor.setAccessible(true);
            // 用静态 HashMap保存,优化性能,同一个类,下次就可以直接拿这个constructor创建
            sConstructorMap.put(name, constructor);
        } else {
        }

        try {
            // 创建View对象
            final View view = constructor.newInstance(args);
            // 返回创建的View对象
            return view;
        } 
    } 
}

通过上面大家不难发现 onCreateView 是在通过反射的方式去创建XML中定义的view。并将他们构建成

小结

整个Inflater.inflate的过程,其实就是就是先进行xml解析,拿到xml中相关的tag的情况下,然后通过反射创建tag对应的View对象的一个流程。

异步inflate

Google开发者在v4包中增加了一个用来异步inflate layouts的帮助类。

AsyncLayoutInflater

AsyncLayoutInflater 是来帮助作异步加载 layout 的,inflate(int, ViewGroup, OnInflateFinishedListener) 方法运行结束以后 OnInflateFinishedListener 会在主线程回调返回 View;这样作旨在 UI 的懒加载或者对用户操作的高响应。

简单的说咱们知道默认状况下 setContentView 函数是在 UI 线程执行的,其中有一系列的耗时动做:Xml的解析、View的反射建立等过程一样是在UI线程执行的,AsyncLayoutInflater 就是来帮咱们把这些过程以异步的方式执行,保持UI线程的高响应。
AsyncLayoutInflater 只有一个构造函数及普通调用函数:inflate(int resid, ViewGroup parent, AsyncLayoutInflater.OnInflateFinishedListener callback),使用也很是方便。

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AsyncLayoutInflater(AsyncLayoutActivity.this)
                .inflate(R.layout.async_layout, null, new AsyncLayoutInflater.OnInflateFinishedListener() {
                    @Override
                    public void onInflateFinished(View view, int resid, ViewGroup parent) {
                        setContentView(view);
                    }
                });
        // 别的操做
    }
AsyncLayoutInflater 构造函数
    public AsyncLayoutInflater(@NonNull Context context) {
        mInflater = new BasicInflater(context);
        mHandler = new Handler(mHandlerCallback);
        mInflateThread = InflateThread.getInstance();
    }

主要作了三件事情:
1.建立 BasicInflater。BasicInflater 继承自 LayoutInflater,只是覆写了 onCreateView:优先加载sClassPrefixList 中做描述的这三个前缀的 view,而后才按照默认的流程去加载,由于大多数状况下咱们 Layout 中使用的View都在这三个 package 下。

private static class BasicInflater extends LayoutInflater {
        private static final String[] sClassPrefixList = {
            "android.widget.",
            "android.webkit.",
            "android.app."
        };
        @Override
        protected View onCreateView(String name, AttributeSet attrs) throws ClassNotFoundException {
            for (String prefix : sClassPrefixList) {
                try {
                    View view = createView(name, prefix, attrs);
                    if (view != null) {
                        return view;
                    }
                } catch (ClassNotFoundException e) {
                }
            }
            return super.onCreateView(name, attrs);
        }
    }

2.建立 Handler。建立 Handler 和它普通的做用同样,就是为了线程切换,AsyncLayoutInflater 是在异步里 inflate layout,那建立出来的 View 对象须要回调给主线程,就是经过 Handler 来实现的。

3.获取 InflateThread 对象。InflateThread 从名字上就好理解,是来作 Inflate 工做的工做线程,经过 InflateThread.getInstance 能够猜想 InflateThread 里面是一个单例,默认只在一个线程中作全部的加载工做,这个类咱们会在下面重点分析

inflate

AsyncLayoutInflater 中有一个非常重要的函数:inflate,那么这个函数是怎样的呢?我们一起看代码

public void inflate(@LayoutRes int resid, @Nullable ViewGroup parent,
            @NonNull OnInflateFinishedListener callback) {
        if (callback == null) {
            throw new NullPointerException("callback argument may not be null!");
        }
        InflateRequest request = mInflateThread.obtainRequest();
        request.inflater = this;
        request.resid = resid;
        request.parent = parent;
        request.callback = callback;
        mInflateThread.enqueue(request);
    }

首先,会经过 InflateThread 去获取一个 InflateRequest,其中有一堆的成员变量。为何须要这个类呢?由于后续异步 inflate 须要一堆的参数(对应 InflateRequest 中的变量),会致使方法签名过长,而使用 InflateRequest 就避免了这一点。那么InflateRequest是什么呢?大家参考下面的代码

private static class InflateRequest {
        AsyncLayoutInflater inflater;
        ViewGroup parent;
        int resid;
        View view;
        OnInflateFinishedListener callback;
        InflateRequest() {
        }
    }

从上面的代码不难发现,InflateRequest 其实就是一个类,这个类代表了一个xml解析的请求所需要的基本信息。

然后,接下来对 InflateRequest 变量赋值以后会将其加到 InflateThread 中的一个队列中等待执行。

public void enqueue(InflateRequest request) {
        try {
            mQueue.put(request);
        } catch (InterruptedException e) {
            throw new RuntimeException(
                    "Failed to enqueue async inflate request", e);
        }
    }
InflateThread
private static class InflateThread extends Thread {
        private static final InflateThread sInstance;
        static {
            // 静态代码块,确保只会建立一次,而且建立即start。
            sInstance = new InflateThread();
            sInstance.start();
        }
       // 单例,避免重复创建线程带来的开销
        public static InflateThread getInstance() {
            return sInstance;
        }

        // 阻塞队列(保存封装过得request)
        private ArrayBlockingQueue<InflateRequest> mQueue = new ArrayBlockingQueue<>(10);
        private SynchronizedPool<InflateRequest> mRequestPool = new SynchronizedPool<>(10);

        public void runInner() {
            InflateRequest request;
            try {
                request = mQueue.take(); // 虽然是死循环,但队列中没有数据会阻塞,不占用cpu
            } catch (InterruptedException ex) {
                // Odd, just continue
                Log.w(TAG, ex);
                return;
            }

            try {
            //解析xml的位置在这
                request.view = request.inflater.mInflater.inflate(
                        request.resid, request.parent, false);
            } catch (RuntimeException ex) {
                // Probably a Looper failure, retry on the UI thread
                Log.w(TAG, "Failed to inflate resource in the background! Retrying on the UI"
                        + " thread", ex);
            }
            // 发送消息到主线程
            Message.obtain(request.inflater.mHandler, 0, request)
                    .sendToTarget();
        }

        @Override
        public void run() {
            // 异步加载布局并使用handler进行
            while (true) {
                runInner();
            }
        }

        public InflateRequest obtainRequest() {
            InflateRequest obj = mRequestPool.acquire();
            if (obj == null) {
                obj = new InflateRequest();
            }
            return obj;
        }

        public void releaseRequest(InflateRequest obj) {
            obj.callback = null;
            obj.inflater = null;
            obj.parent = null;
            obj.resid = 0;
            obj.view = null;
            mRequestPool.release(obj);
        }

        public void enqueue(InflateRequest request) {
            try {
                mQueue.put(request);// 添加到缓存队列中
            } catch (InterruptedException e) {
                throw new RuntimeException(
                        "Failed to enqueue async inflate request", e);
            }
        }
    }

总结:

SyncLayoutInflater使用的是ArrayBlockingQueue来实现此模型,所以如果连续大量的调用AsyncLayoutInflater创建布局,可能会造成缓冲区阻塞。
enqueue 函数:只是插入元素到 mQueue 队列中,若是元素过多那么是有排队机制的;
runInner 函数:运行于循环中,从 mQueue 队列取出元素,调用 inflate 方法返回主线程;

SyncLayoutInflater 就是用于异步加载layout的,可以用于懒加载中,或者是在用户想提升onCreate函数的执行效率的时候。但是,它有几个缺陷:1)异步转换出来的 View 并没有被加到 parent view中,AsyncLayoutInflater 是调用了 LayoutInflater.inflate(int, ViewGroup, false),因此如果需要加到 parent view 中,就需要我们自己手动添加; 2)不支持加载包含 Fragment 的 layout。


由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~

PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)

目录

img

第一章 Java方面

  • Java基础部分
  • Java集合
  • Java多线程
  • Java虚拟机

img

第二章 Android方面

  • Android四大组件相关
  • Android异步任务和消息机制
  • Android UI绘制相关
  • Android性能调优相关
  • Android中的IPC
  • Android系统SDK相关
  • 第三方框架分析
  • 综合技术
  • 数据结构方面
  • 设计模式
  • 计算机网络方面
  • Kotlin方面

img

第三章 音视频开发高频面试题

  • 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
  • 怎么做到直播秒开优化?
  • 直方图在图像处理里面最重要的作用是什么?
  • 数字图像滤波有哪些方法?
  • 图像可以提取的特征有哪些?
  • 衡量图像重建好坏的标准有哪些?怎样计算?

img

第四章 Flutter高频面试题

  • Dart部分
  • Flutter部分

img

第五章 算法高频面试题

  • 如何高效寻找素数
  • 如何运用二分查找算法
  • 如何高效解决雨水问题
  • 如何去除有序数组的重复元素
  • 如何高效进行模幂运算
  • 如何寻找最长回文子串

img

第六章 Andrio Framework方面

  • 系统启动流程面试题解析
  • Binder面试题解析
  • Handler面试题解析
  • AMS面试题解析

img

2024Android-高级面试题及答案(Google收录,值得推荐!) AIDL是使用bind机制来工作。参数:java原生参数Stringparcelablelist & map 元素 需要支持AIDL回到顶部。 阅读详情

相关推荐

2024年Android面试题汇总(中高级)

那么为什么MVP模式中的P层中的view要用弱引用呢,我们可以这样么考虑,我们希望activity关闭的同时view也被回收,如果activity关闭,那么会进行GC,那么弱引用对象就会回收。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。答:单例模式,工厂模式,观察者模式,Builder模式,克隆模式,策略模式这几种个人认为是比较常见的,然后主要要区分工厂模式和策略模式的区别。漏的可视化,是我们开发中必备的工具之一。

m0_56175058的博客 1443

2023最新高频Android面试题总结(附答案)

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。应用场景:1. 逆向代码,例如反编译2. 与注解相结合的框架,如 Retrofit3. 单纯的反射机制应用框架,例如 EventBus(事件总线)4. 动态生成类框架 例如Gson。

老皮的博客 6157

2021年大厂 Android 高级开发面试题汇总(面试题+答案解析)

前言 面试大厂,那就是考察你技术方向的一些专业技能,如果你面试 Android 岗位,那 Android 方向的专业技能就是考察很重要的一个方向。 但是话说回来,即便这条是所有人都知道的共识,也不是所有人都能搞得定。有些人就是觉得自己基础差、非科班,要么知难而退,要么没有决心啃下这块硬骨头,这时候就体现每个人面对困难的方式了。 再退一步讲,即便不想加入大厂,在IT 领域,如果你想吃技术这碗饭,长久来看,专业技能也会制约一个人的上限,等到工作室越长,年龄越来越大,专业技能的熟练程度就会和别的程序员之间差距越.

qq_44102588的博客 1631

Android高级面试题大全(持续更新中)

1. ThreadLocal的理解 可以保证线程的安全。在多个线程共享相同的数据的时候,会为每个线程创建单独的副本,在单独的副本上进行数据的操作,不会对其它线程的数据产生影响,保证了线程安全。 2. HashMap HashSet HashTable的区别? 都是集合,底层都是Hash算法实现的。HashMap是Hashtable的替代品,这两个都是双列集合,而HashSet是单...

mythmayor的博客 3万+

Android 高级开发面试题以及答案整理

Android 高级开发面试题以及答案整理

一篇文章将三极管讲透:三极管从原理到应用,从参数到特性,从入门到精通

晶体三极管(Transistor)是一种半导体电子器件,也是电子工程中最基本的元件之一。它有三个区域,分别是P型半导体,N型半导体和P型半导体,从而形成PNP型晶体三极管或者NPN型晶体三极管。

学习帮的博客 9万+

Android高级UI面试题汇总(含详细解析二十五)

AttachedScrap、ChangedScrap只与Notify更新数据有关,与滑动过程的回收无关,二者的空间是没有限定大小的。在一次Notify更新的过程中不需要发生变化的列表项Item会存放在AttachedScrap内,需要更新的列表项Item会放置在ChangedScrap,所以AttachedScrap、ChangedScrap被称之为屏幕内的缓存。CacheViews是用于保存最新被移除(remove。

Misdirection_XG的博客 133

ESP32-S3驱动PCA9685模块:I2C扩展16路舵机控制实战指南

本文提供了ESP32-S3通过I2C总线驱动PCA9685模块扩展16路PWM输出的完整实战指南。详细解析了PCA9685模块原理、硬件连接、I2C地址配置,并给出了核心驱动代码与角度控制函数,帮助开发者解决微控制器PWM引脚不足的问题,轻松实现多路舵机控制。

weixin_32005771的博客 522

Android高级UI详解汇总

Android高级UI开发(一)RecyclerView控件的基本使用 Android高级UI开发(二)RecyclerView控件使用----列表项的单击事件、添加(删除)列表项 Android高级UI开发 ( 三 )RecyclerView控件---高级进阶之自己绘制列表分隔线 ...

gaoxiaoweiandy的专栏 4438

电力-平衡式IEC 60870-5-101规约报文解析

本文详细介绍了电力自动化中平衡式IEC 60870-5-101规约的应用,包括链路建立与初始化、对时、遥控操作、数据上送和总召唤等关键步骤,通过实例解析了报文格式和交互过程,是理解配网自动化通信的重要参考资料。

让你爱上电路设计 5685

用Python可视化硅晶体生长:3D图解<100>/<110>/<111>晶向差异

本文通过Python 3D可视化技术,详细解析了硅晶体生长中<100>、<110>、<111>三种关键晶向的差异及其在半导体工业中的应用。从密勒指数转换到原子密度计算,结合交互式3D模型展示不同晶向的原子排列特性,帮助读者深入理解晶向对芯片性能的影响。

weixin_42567752的博客 568

Android高级UI面试题汇总(含详细解析 十六)

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊👀你想要的面试题这里都有👀👇👇👇。

Misdirection_XG的博客 144

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 381

Android高级UI面试题汇总(含详细解析 十)

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊👀你想要的面试题这里都有👀👇👇👇。

Misdirection_XG的博客 157

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

在 SAP 中修改 Profile 文件中的主机名需要谨慎操作,需需确保所有相关配置保持一致

在SAP系统中修改Profile文件主机名需谨慎操作,主要步骤包括:1)停止相关SAP服务;2)重命名并编辑实例级Profile文件(如ER1_D00_OLDHOST改为ER1_D00_LRPSAP),修改所有含旧主机名的参数;3)可选更新默认Profile文件;4)在Windows系统中调整注册表配置;5)验证一致性后重启服务。关键注意:保持大小写统一、修改前备份文件、集群环境需同步所有节点。通过系统日志确认新主机名生效且无报错。

金牌架构师 1049

2022最新 Android 中高级面试题汇总(含答案解析)

准备面试少不了Android面试题复习,面试题也需要有方法,高效的进行复习,所以给大家分享一份《2022最新 Android 中高级面试题汇总》,基本涵盖了 Android中高级工程师面试必备知识点,希望可以帮助一些想要跳槽涨薪的朋友更好、更高效的复习,实现跳槽涨薪。

datian1234的博客 2826

如何绘制电气绝缘图(GB9706.1-2007和GB9706.1-2020差异)

是用来描述要考虑设备的绝缘状况和它们的值 ,从而便于和相关部门交流和沟通,如权威机构和检测实验室等。本文为绝缘图的实例, 包括所有相关的绝缘路径以及介电强度,爬电距离和电气间隙的值。

学海无涯的专栏 1万+

Android高级UI面试题汇总(含详细解析 三)

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊👀你想要的面试题这里都有👀👇👇👇。

Misdirection_XG的博客 224

深度学习工具包 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")

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android高级UI面试题汇总(含详细解析 十三)

责任链模式是行为型设计模式中的一个。责任链模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

Misdirection_XG的博客 188

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【必看】《2024最新Android中高级面试题汇总》它来了~_安卓 中高级

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

2401_84544363的博客 1078

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android高级UI面试题汇总(含详细解析 五)

第一点:子线程可以在ViewRootImpl还没有创建之前更新UI的第二点:访问UI是没有加对象锁的,在子线程环境下更新UI,会造成各种未知风险的第三点:Android开发者一定要在主线程更新UI操作,这个是职业习惯哦由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)

Misdirection_XG的博客 184

Android高级UI面试题汇总(含详细解析 九)

RequestLayout()方法:会导致调用 onMeasure()方法和 onLayout(),将会根据标志位判断是否 需要 onDraw();onLayout():摆放 viewGroup 里面的子控件,只有自定义ViewGroup需要重写;onDraw():绘制视图本身(ViewGroup 还需要绘制里面的所有子控件);drawChild(): 重新回调每一个子视图的 draw 方法 ,child.draw(canvas, this, drawingTime);

Misdirection_XG的博客 158

Android高级UI面试题汇总(含详细解析 一)

View的绘制流程是面试最容易被问到的问题,而且这个问题面试者非常容易满足于一知半解。这道问题的正确的回答方式是从viewRootImpl开始,解析整个viewTree的构建分发流程。由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)

Misdirection_XG的博客 185

Android高级UI面试题汇总(含详细解析 八)

RequestLayout()方法:会导致调用 onMeasure()方法和 onLayout(),将会根据标志位判断是否 需要 onDraw();onLayout():摆放 viewGroup 里面的子控件,只有自定义ViewGroup需要重写;onDraw():绘制视图本身(ViewGroup 还需要绘制里面的所有子控件);drawChild(): 重新回调每一个子视图的 draw 方法 ,child.draw(canvas, this, drawingTime);

Misdirection_XG的博客 174

Android高级UI面试题汇总(含详细解析二十)

名称原理优点适用对象说明浏览器缓存使用HTTP协议头部字段进行缓存控制支持HTTP协议层存储静态资源Android默认实现通过存储键值对实现存储空间大,数据在本地,安全便捷类似Cookies,存储临时的简单数据类似Android中的SP基于SQL利用数据库优势,增删改查方便存储复杂、数据量大的结构化数据不推荐使用,用IndexedDB替代IndexedDB通过存储键值对实现(NoSQL)存储空间大、使用简单灵活存储复杂、数据量大的结构化数据。

Misdirection_XG的博客 177
上一篇: Android高级UI面试题汇总(含详细解析 十四)
下一篇: Android高级UI面试题汇总(含详细解析 十六)
网络安全-XG
博客等级 码龄5年 1万+粉丝 2752原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值