Android开发者们要知道的那些事儿

Part One

一些开源框架的机制是什么?

1.RxJava的机制是什么?

RxJava是使用Java语言,以响应式编程思维来进行编程的Java类库。
####2.Butterknife的机制是什么?
巧妙运用Java注解,能运用注解建立在 Java Annotation Processing技术上,在Java代码编译成Java字节码的时候就已经处理了@Bind、@OnClick等注解

Annotation Processing是Javac中用于编译时扫描和解析Java注解的工具
Annotation Processing是在编译阶段执行的,它的原理就是读入Java源代码,解析注解,然后生成新的Java代码
新生成的Java代码最后被编译成Java字节码,注解解析器(Annotation Processing)不能改变读入的Java类,比如给Java类添加方法或者删除类中的方法。


Part Two

一些网络框架的对比与总结:

Android开发中常用的网络请求框架OKHttp、Volley、XUtils、Retrofit 对比

1.XUtils
此框架庞大而周全,这个框架可以进行网络请求、图片加载、数据存储以及View注解。使用这个框架很方便,这样会是的你的整个项目对它的依赖性太强,这就存在一个问题,万一以后这个库不在维护了,或者使用过程中某一个模块不能满足我们的需求,那后果就不敢设想了。要知道想要修改这个库里面的某一个模块,来满足自己项目的需求,从各个方面来说都是有难度的。


2.Volley
这个框架是Google官方提供的一个轻巧的网络请求框架,适合进行数据量小,发送请求比较多的情况。这个框架的扩展性很强,完美支持HttpClient、HttpUrlConnection。而且Volley中封装的有ImageLoader,对于有图片加载需求的可以通过Volley内置的图片加载框架完成需求。不过对于复杂的需求建议还是使用专门的图片加载框架(Glide or Fresco or Picasso框架都是不错的选择)。对与Volley的缺陷就是,它不适合进行post数据量较大的请求。


3.OKHttp
目前HttpClient已经被废弃,android-async-http框架是基于HttpClient的,所以异步请求框架也就不在维护了。另外保留的可以直接进行网络请求的就是使用HttpUrlConnection。
OKHttp是Square公司开源的针对Java和Android程序封装的一个高性能的http请求库,经历了1、2、3个版本。它的职责就是和HttpURLConnection一样,支持spdy、http2.0、webSocket,支持同步、异步,而且OKHttp又封装了线程池,封装了数据转换,封装了参数使用,错误处理等。API使用起来很方便,可以把这个框架理解成一个封装之后的类似HttpURLConnection的东西,但是在使用的时候仍需要自己再做一层封装,这样才能有成就感,使用起来也会更加顺手。


4.Retrofit
Retrofit 是Square公司出品的默认基于OKHttp封装的一套RESTful网络请求框架,RESTful是目前流行的一套API设计风格,并不是标准。Retrofit里面涉及到一堆的设计模式,可以通过注解直接配置请求,可以使用不同的http客户端,虽然默认是用http。在序列化数据方面,可以使用Json Converter来序列化数据。同是提供对Rxjava的支持,开发中经常见到的组合方式是:RxJava + Retrofit + Gson + Dagger2 或者 Rxjava + Retrofit + Gson + OKHttp + Dagger2
在使用这个组合框架的时候,建议大家还是要先看看基础的用法,这样在使用过程中如果出现问题也能更好的解决。另外建议:如果你使用Dagger2不熟练的话可以考虑去掉Dagger2(如果你的项目周期比较紧张,没有时间去学习了解Dagger2的话),记得有一个项目就是没有使用Dagger2,使用起来相对麻烦了点,但是逻辑相对比较清晰(这样说是因为当时刚接触Dagger2,不熟练,所以觉得逻辑乱,后来就觉得还是有Dagger2 比较好~~不喜勿喷!)。
这里多少一点:Retrofit2.0要比Retrofit1.0好用很多,想知道他们之间区别的朋友可以去查下资料,反正LZ是有了2.0就不想用1.0了。


总结:

开发中建议使用框架顺序排列:
Retrofit – OKHttp – Volley(其实这个要看你们项目中单个请求的数据量) – XUtils(这个库比较庞大,功能也很牛X,一般的小项目我觉的可以不用使用这个,从安装包体积和需求实现建议程度上考虑)


Part Three

提升逼格的一些point

1.说说ORM框架

首先说一下什么是ORM框架:

所谓ORM框架就是:对象-关系映射(Object/Relation Mapping)的简称。它是随着面向对象的软件开发方法发展而产生的。面向对象的开发方式是当今企业级应用开发环境中的主流方式,关系型数据库是企业级应用环境中持久化数据的存储方式。对象和关系数据是业务实体的两种表现形式。业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多的关联关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序中对象到关系数据库数据的映射


下面说一下ORM方法论基于的三个核心原则:

  • 简单性:以最简单的形式建模数据
  • 传达性:数据库结构被任何人都能理解
  • 精确性:基于数据模型创建正确标准化的结构

一般ORM包括以下四部分:

  • 一个对持久类对象进行增删改查操作的API
  • 一个对类和类属性相关的查询的API
  • 一个规定Mapping Metadata的工具
  • 一种技术可以让ORM的实现同事务对象一起进行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的优化操作

作为Android开发者,下面的这些我们要知道:


在非UI线程中使用Handler需要注意的问题
new Thread (){
	public void run(){
		// 给当前线程初始化Looper,线程中默认是没有looper的,所以要先初始化一下Looper
		Looper.prepare();
		// UI相关的操作,这种操作会执行new Handler();在创建Handler对象的时候,会获取当前线程的Looper
		Toast.makeText(getApplicationContext(), "UI").show();
		// 这句执行,操作UI的Handler发出的消息就会被处理,toast也就会线束出来了
		Looper.loop();
	}.start();
}

Service有哪些派生的类?及其这些类的应用场景

首先Service的派生类有很多(原生的,不包含用户自己写的service类)

1.InputMethodService 输入法服务
2.MediaBrowserService 媒体浏览器服务
3.SpellCheckerService 拼写检查的服务
4.IntentService 用来处理异步请求的service。这个是开发中经常用到的service(提醒:部分敲代码的习惯性的认为Service就是在后台处理耗时的操作的!!!在这里提醒大家,service默认是运行在UI线程的。之前面试过几个人,每次问到Service的时候,他们给我的感觉是Service就是后台的一个非UI线程)


Activity的onNewInstent()方法在什么时候会被执行

执行条件:

1.当前activity的实例已经存在
2.当前Activity的启动模式是SingleTask 或者 SingleInstance,当前activity被开启的时候
3.当前activity的启动模式是SingleTop且当前activity正在显示,此时当前activity又被开启的时候


Activity A 使用startActivity()和使用startActivityForResult()方法启动Activity B,在B界面什么都不做直接返回时,A的onActivityResult()方法会执行么?

答案:会执行

原因:startActivity()方法中其实也是调用startActivityForResult()方法,requestCode = -1而已。


Fragment能否独立存在

Fragment不能独立存在,它必须嵌入到activity中。而且Fragment的生命周期直接受所在Activity生命周期的影响。生命周期:http://www.jianshu.com/p/04a1b2b2aa29


热修复的原理

1:JavaSisst

2:AspectJ

3:Xposef
链接:
http://mp.weixin.qq.com/s?__biz=MzA3Mjk1MjA4Nw==&mid=400452659&idx=1&sn=841b49b875ec3b307f261ed52a7d9c4e&scene=23&srcid=1119JWRt0adNwGxTHiyok460#rd


apk 安装及卸载的原理

安装:

1.复制apk安装包到data/app目录下,解压并扫描安装包
2.把dex文件保存到dalvik-cache目录
3.并在data/data目录下创建对应的应用数据目录

卸载:

删除安装过程中上述三个目录下的文件及相关目录


Serializable 和 Parcelable的区别

内存方面:

Parcelable 类性能比较高,但是不适合持久化数据到磁盘上

其他方面:

1.Serializable 在序列化的时候会产生大量临时变量,易触发GC
2.Parcelable 不能使用在 数据持久化到磁盘上的情况。有这方面需求的建议使用Serializable类


进程间通信方式
  1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的 进程间使用。进程的亲缘关系通常是指父子进程关系。
  2. 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的 通信。
  3. 信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它 常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进 程间以及同一进程内不同线程之间的同步手段。
  4. 消息队列( messagequeue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符 标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  5. 信号 (sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  6. 共享内存(shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内 存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间 通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间 的同步和通信。
说说 LruCache 底层原理
LruCache 使用一个 LinkedHashMap 简单的实现内存的缓存,没有软引用,都是强引用。如果添 加的数据大于设置的最大值,就删除最先缓存的数据来调整内存。

maxSize 是通过构造方法初始化的值,他表示这个缓存能缓存的最大值是多少。

size 在添加和移除缓存都被更新值,他通过 safeSizeOf 这个方法更新值。safeSizeOf 默认返回 1, 但一般我们会根据 maxSize 重写这个方法,比如认为 maxSize 代表是 KB 的话,那么就以 KB 为单 位返回该项所占的内存大小。

除异常外首先会判断 size 是否超过 maxSize,如果超过了就取出最先插入的缓存,如果不为空就 删掉,并把 size 减去该项所占的大小。这个操作将一直循环下去,直到 size 比 maxSize 小或者缓存 为空。

Part Four

资料地址:
http://www.jianshu.com/p/3acf5b12fff8

对原文中的某一些知识点做了些补充,整体上是按照资料中的逻辑去分析和归整的,谢谢大家!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值