Android面经-提升篇(持续更新...)

本文链接: Android面经-基础篇(持续更新…) - CSDN博客 ,在此说明本人可能用到很多博客的链接以及话语引用没有说明,请相关的博主莫怪,本人也没有想过靠这些来进行吸引来达到盈利的目的,纯碎是为了保存好这些自己觉得写得很好的博文


自定义View

  • Android LayoutInflater原理分析,带你一步步深入了解View(一) - 郭霖的专栏 - CSDN博客 -三篇
  • Android View 事件分发机制 源码解析 (上) - Hongyang - CSDN博客 -几篇
  • Android绘图机制(一)——自定义View的基础属性和方法 - 刘桂林的博客 - CSDN博客-三篇
  • Android学习Scroller(五)——详解Scroller调用过程以及View的重绘 - CSDN博客
  • scrollTo与scrollBy用法以及TouchSlop与VelocityTracker解析 - zejian的博客 - CSDN博客 -两篇
  • 自定义控件三部曲之动画篇(四)——ValueAnimator基本使用 - 启舰 - CSDN博客 -他写的东西都很广很全容易理解
  • 你真的会用OnTouchListener、OnClickListener、OnLongClickListener监听事件么? - thuai - 博客园

Android面经-提升篇(持续更新...)_第1张图片

探讨:加载布局inflate(int resource, ViewGroup root, boolean attachToRoot)

  1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
  2. 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
  3. 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
  4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。

郭霖先生的博客讲解到:Android LayoutInflater原理分析,带你一步步深入了解View(一) - 郭霖的专栏 - CSDN博客

验证代码:
1.activity_main.xml:


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/lyo_content"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#ff0"
        android:orientation="vertical"/>

LinearLayout>

2.button_layout.xml:


<Button
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="80dp"
    android:text="Button">

Button>

3.button_layout1.xml:


<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="300dp"
        android:layout_height="80dp"
        android:text="Button"/>

RelativeLayout>

4.

        mainLayout = (LinearLayout) findViewById(R.id.main_layout);
        lyo_content = (LinearLayout) findViewById(R.id.lyo_content);
        LayoutInflater layoutInflater = LayoutInflater.from(this);


        View buttonLayout0 = layoutInflater.inflate(R.layout.button_layout, null);
        mainLayout.addView(buttonLayout0);

        View buttonLayout00 = layoutInflater.inflate(R.layout.button_layout, null);
        lyo_content.addView(buttonLayout00);


        View buttonLayout1 = layoutInflater.inflate(R.layout.button_layout, mainLayout, true);
        //mainLayout.addView(buttonLayout);不可以再设置父布局buttonLayout1,因为它有了父布局


        View buttonLayout2 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
        mainLayout.addView(buttonLayout2);

        View buttonLayout22 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
        lyo_content.addView(buttonLayout22);


        View buttonLayout3 = layoutInflater.inflate(R.layout.button_layout1, null);
        mainLayout.addView(buttonLayout3);

结果:
Android面经-提升篇(持续更新...)_第2张图片

解释:当一个view加载的时候没有父布局(没有xml中设置以及代码加载时候没有指定),设置的layout_width跟layout_height都是无用的,一个布局有且仅有绑定在一个布局(只可以绑定一次),一旦绑定必须解绑才可以绑定到其他布局去

这里有两个有趣的问题:
1.如下面代码所示,两个加载布局都是用mainLayout属性属性进行加载的(当时都没有绑定),之后一个绑定在mainLayout,一个绑定在lyo_content上,造成了上面截图的结果

        View buttonLayout2 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
        mainLayout.addView(buttonLayout2);

        View buttonLayout22 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
        lyo_content.addView(buttonLayout22);

2.为什么activity_main布局的第一层是有效的
因为它预先加载了一个id为content的FrameLayout来装载activity_main这个布局

3.关于B拦截了子视图C的Move事件B本身不消费,是否上交给上司处理呢? - CSDN博客

4.Android关于触摸事件跟点击事件两个方法的关系 - CSDN博客

5.Android中事件分发机制 - qq97206858的博客 - CSDN博客

异步消息

  • Android异步消息处理机制完全解析,带你从源码的角度彻底理解 - CSDN博客
  • android 异步通信机制Handler的分析与运用 - 掘金
    • 在dispatchMessage里面
      • 第一个msg.callback指的callback接口是Message.obtain(handler,callback)
        ;这里的callback其实就是一个Runnable类型
      • mCallback是构造方法Handler(looper,callback,async)传进来;这里的callback
        是一个接口,里面有handleMessage方法
      • 最后一个handleMessage(msg)才是我们熟悉的handler创建时候需要重写的方法
        (这个方法本身为空实现,需要我们自己重写)。
    • tips:
      • Handler post()方法传入的runnable之后属于msg.callback
      • View post()方法调用的是 Handler post()方法
      • Activity runOnUiThread()方法如果当前线程是主线程,直接调用run方法;
        否则调用的是Handler post()方法

设计模式

  • 真正的深入浅出“设计模式” - 最易懂的设计模式解析 - 简书
  • 常用设计模式:模式宗师养成宝典之Java版学习路径慕课网
  • simplebam/JavaDesignPatterns: Java常用的设计模式 -这里需要推荐一本入门书<<大话设计模式>>

网路框架

  • Android开源项目推荐之「网络请求哪家强」 - stormzhang

计算机网络(博客按顺序看)

  • 计算机网络(第7版)PDF 下载_Java知识分享网-免费Java资源下载
  • 计算机网络基础1 - 你过来看看 - SegmentFault
  • 计算机网络基础2 - 你过来看看 - SegmentFault
  • IP子网划分_百度百科
  • 你应该知道的计算机网络知识 - 简书
  • HTTPS科普扫盲帖 - 程序猿小卡的前端专栏 - SegmentFault
  • HTTP/1.1与HTTP/1.0的区别 - CSDN博客 –粗略看一下就好
  • SSL/TLS协议运行机制的概述 - 阮一峰的网络日志
  • TCP/UDP区别以及UDP如何实现可靠传输 - CSDN博客
  • Android网络请求心路历程 - 简书

Socket

  • Java Socket编程—-通信是这样炼成的 - rocomp - 博客园
  • Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通) - CSDN博客

Volley

  • 先要看懂java多线程设计模式之消费者生产者模式
  • 生产者/消费者模式(阻塞队列) - CSDN博客
  • Android Volley完全解析(一),初识Volley的基本用法 - 郭霖的专栏 - CSDN博客
  • Android Volley完全解析(二),使用Volley加载网络图片 - 郭霖的专栏 - CSDN博客
  • Android Volley完全解析(三),定制自己的Request - 郭霖的专栏 - CSDN博客
  • Android Volley完全解析(四),带你从源码的角度理解Volley - 郭霖的专栏 - CSDN博客
  • 聊下Volley源码(整体流程) - CSDN博客 -看郭霖先生的先
  • 手撕 Volley (一) - 简书 -看郭霖先生的先
  • 手撕 Volley(二) - 简书 -看郭霖先生的先

OkHttp

  • OkHttp使用教程 - 泡在网上的日子 –这里有很多方法对于3.9.0的OkHttp已经是失效的,建议看下面的一篇
  • OkHttp使用完全教程 - 简书 -跟上篇差不多,但涉及Http基础介绍,更值得一看
  • 也可以看一下鸿洋的封装自己的Okhttp库的文章,在前面的部分也提及到一些基础用法
  • OkHttp3之Cookies管理及持久化 - Akioss Share - SegmentFault
  • OkHttp踩坑记:为何 response.body().string() 只能调用一次?
  • Okhttp使用指南与源码分析 - 简书 –有空就要仔细研读一下源码!!!!
  • Okhttp缓存源码分析和自定义缓存实现 - 简书
  • 拆轮子系列:拆 OkHttp - Piasy的博客 | Piasy Blog

OkHttp取消的问题

在3.0之后不可以通过okHttpClient.cancel(tag)来取消一个请求

        call.cancel();//直接取消当前的请求
        client.dispatcher().cancelAll();//取消当前客户端上的全部请求

你也可以自己封装一个方法,按TAG来取消所有请求:

    public void cancle(Object tag,OkHttpClient okHttpClient){
        Dispatcher dispatcher = okHttpClient.dispatcher();
        synchronized (dispatcher){
            //遍历请求队列里面的
            for (Call call : dispatcher.queuedCalls()) {
                if (tag.equals(call.request().tag())) {
                    call.cancel();
                }
            }

            //遍历在运行队列里面的
            for (Call call : dispatcher.runningCalls()) {
                if (tag.equals(call.request().tag())) {
                    call.cancel();
                }
            }
        }
    }

实际上,我们一般使用OkHttp开源库居多一点:OkHttpFinal OkHttp 封装的一个简单易用 HTTP 请求和文件下载管理框架。 @codeKK Android 开源站

Retrofit2

  • 你真的会用Gson吗?Gson使用指南(一) - 简书 4篇文章都很经典,建议你需要看看哈,为了理解注解,反射等Java基础
  • 你真的会用Retrofit2吗?Retrofit2完全教程 - 简书
  • Retrofit2 的baseUrl 真的必须以 /(斜线) 结尾吗? - 简书
  • Retrofit2 完全解析 探索与okhttp之间的关系 - CSDN博客


事件总线

  • Android事件总线EventBus详解 - CSDN博客
  • Android事件总线(一)EventBus3.0用法全解析 - 刘望舒的专栏 - CSDN博客
  • Android事件总线(二)EventBus3.0源码解析 | 刘望舒的博客
  • Android事件总线(三)otto用法全解析 | 刘望舒的博客
  • Android事件总线(四)源码解析otto | 刘望舒的博客
    注:刘望舒的《Android进阶之光》个人认为不要买,虽然里面都是安卓最新的知识,但讲解上跟鸿洋以及郭霖先生的通俗易懂差距很大,他的书籍的思维跳跃性大,文笔啰嗦,表达能力差,我买了之后都是根据里面的知识点查看博客来弄懂的

函数式响应编程-RxJava2.0

  • 目前最好的RxJava入门文章,没有之一:给初学者的RxJava2.0教程(一) - 简书
    以及对应的项目教程源码:ssseasonnn/RxJava2Demo
  • 这可能是最好的RxJava 2.x 教程(完结版)- 简书
  • 其他RxJava文章推荐:RxJava2 学习资料推荐
  • RxJava之过滤操作符 - 行云间 - CSDN博客
  • RxJava2使用过程中遇到的坑 - CSDN博客
  • 这是一份全面 & 详细 的RxJava操作符 使用攻略

注解与依赖注入框架

  • Java反射以及在Android中的特殊应用 - 掘金
  • Android注解快速入门和实用解析 - 简书
  • android注解入门 并来自己写一个框架 - 范明毅的个人博客 - CSDN博客

图片框架

  • Android开源项目推荐之「图片加载到底哪家强」 - stormzhang

Glide

  • Android图片加载框架最全解析(一),Glide的基本用法 - 郭霖的专栏 - CSDN博客 -这个是3.x系列的Glide
  • 带你全面了解Glide 4的用法


Gradle

  • Gradle学习系列之一——Gradle快速入门 - 无知者云 - 博客园

项目框架

  • Android官方架构组件指南 - 番茄沙司 - 博客园

MVP

  • Android App的设计架构:MVC,MVP,MVVM与架构经验谈 - 伍歌歌 - 博客园
  • Android mvp 架构的自述 - CSDN博客
  • 如何更高效的使用MVP以及官方MVP架构解析 - CSDN博客
  • Android MVP Plugin,一键完成MVP结构代码编写

Git

  • Pro Git(中文版)
  • Git用法的全面解析,结合Android Studio来讲Git
  • 从什么都不懂开始(三) 实践带你飞之Branch操作 - CSDN博客
  • Git使用教程 - 龙恩0707 - 博客园

推荐阅读

  • Android 开发之版本统一规范 | Blankj’s Blog
  • 构建 Android 应用程序一定要绕过的 30 个坑
  • Android干货框架集锦,搭建项目必不可少
  • Android 中内存泄漏的原因和解决方案 - 简书
  • 推荐一些值得订阅的 Android 技术专栏
  • 讲给Android程序员看的前端和后台教程 - 谷哥的小弟 - CSDN博客

Android源码级分析

  • Android消息循环机制源码分析
  • Android 开源项目源码解析

性能优化

  • 小细节,大用途,35 个 Java 代码性能优化总结!
  • 必知必会 | Android 性能优化的方面方面都在这儿
  • Android 性能优化必知必会 | Android Performance - Android - 掘金
  • Android布局优化之ViewStub、include、merge使用与源码分析 - CSDN博客

Android面经

  • 2017 Android秋招面试总结 - 简书
  • 最接地气的Android面试总结心得 - 简书
  • 收藏夹中,收藏的那些Android干货(必须收藏)
  • Android开发工程师面试指南(面试题集附答案、简历模板) - 掘金
  • Android 面试 | 全站式导航 - Android - 掘金
  • Android工程师之Android面试大纲
  • Android笔试面试指南
  • 还是要提升自己的算法的:Blankj/awesome-java-leetcode: LeetCode of algorithms with java solution(updating).

面试通用

  • 干 货 | 春招网申即将到来!一分钟教你避免这些巨坑!
  • 干 货 | 面试时,如何在一分钟内更好的展现自己?
  • 如何完美地做自我介绍?
  • 面试热问|你最大的优点是什么?(回答技巧及范例)
  • 你的简历总被拒,原因是写的太详细 | 应届生的绝地求生3
  • 3分钟读懂:校招面试,业务Leader、HR、总监分别都在考什么? | 应届生的绝地求生4
  • 【别死在一面】无领导小组面试最全攻略:要点 评分 角色 说什么
  • 最详细的三方协议毁约流程 - 乔布简历
  • 干货丨HR和我谈五险一金,我该知道哪些以防被坑?
  • 95%的人在面试时不会谈薪,包括你!
  • 不想租房被坑?看这里!
  • 面试最容易被刷的问题:你的缺点是什么?
  • 面试:如何正确回答“你有什么问题想问我吗?”
  • 面试穿正装会加分么?

    ————-我是低调的分割线————————–
    博客美化 - 萌小Q - 博客园

如果对你有帮助,可以点击“推荐”哦`(*∩_∩*)′

你可能感兴趣的:(面试,Android)