------------------------------------------更新--------------------------------------------
建表:create table user(id Integer(11) primary key auto_increment,name varchar(20));
增:insert into user(name,age,sex) values(?,?,?);
删:delete from user where name=?;
改:update user set age=21 where name=lisi; —把lisi的年龄改成21
查询所有:select * from user;
根据名称查找:select * from user where name=?;
在创建Fragment的时候调用这个Fragment的setArguments()传入一个Bundle对象传入数据(不推荐传非基本类型的)
两种方式:
MainActivity activity = (MainActivity )getActivity();
activity.sendMsg("内容");
Activity
oncreate onStart onResume onPause onStop onDestory onRestart
onCreate() 不可见状态 ,Activity被创建时回调,主要做初始化工作。
onStart() 可见状态,表示Activity正在启动,此时Activity处于可见状态,无法进行交互。
onResume() 可见状态, 此方法回调时,Activity已在在屏幕上显示UI并允许用户操作
onPause() 暂停状态
onStop() 不可见状态,Activity即将停止或者完全被覆盖,仅在后台运行。同样的,在onStop方法可以做一些资源释放的操作,不能太耗时
onDestroy() 销毁状态,Activity正在被销毁,也是生命周期最后一个执行的方法
一般可以在此方法中做一些回收工作和最终的资源释放。
onRestart() 由不可见变为可见
在ACtivity跳转到其他页面后 ,返回到这个Activity时会调用该方法
onSaveInstanceState()**------了解
不是声明周期方法但是会在生命周期运行时被调用
用于保存activity的状态,当应用遇到(内存不足,用户直接按home键)由系统直接销毁一个Activity时onSaveInstanceState()就会调用,但是当用户主动销毁activity如按back键,或直接执行finish(),这种情况下就不会执行,因为这种情况下,用户的行为决定了不需要保存Activity的状态。
onRestoreInstanceState()-----了解
当您的Activity在之前被破坏后重新创建时,回调onRestoreInstanceState()会收到onSaveInstanceState ()中Bundle保存的实例状态信息,共享上个意外销毁的实例的信息。
onAttach()
fragment和activity进行绑定
onCreate()
调用时 Fragment对象创建完成
onCreateView()
用于创建Fragment的视图View
onActivityCreated()
被调用时说明Activity准备完成 ,可以显示Fragment了
onStart()
Fragment启动显示,但是无法操作
onResume()
完全显示,可以允许用户操作
onPause()
调用时Fragment暂停,一般会跟随调用onStop(),常在切换Fragment前被调用
onStop()
调用时FragmentFragment停止
onDestroyView() 销毁View
调用时 Fragment的view被销毁
onDestroy() 销毁状态
调用时Fragment被销毁
onDetach()
Activity与Fragment解除依附状态
OkHttp3的最底层是Socket,它通过Platform的Class.forName()反射获得当前Runtime使用的socket库。在connection接口中封装创建socket对象和连接到目标网络,通过RealConnection来实现。数据的输入输出流操作通过stream接口来实现。且okhttp 使用责任链模式执行五大拦截器来实现对请求数据和响应数据进行处理。
以下了解即可:
单例模式:
创建okhttpclient对象最好采用单例模式来创建, 因为每个 OkHttpClient 对象都管理自己独有的线程池和连接池。 每一个请求都创建一个 OkHttpClient 导致内存爆掉
外观模式:OKHttpClient 里面组合了很多的类对象。其实是将OKHttp的很多功能模块,全部包装进这个类中,让这个类单独提供对外的API,这种设计叫做外观模式(外观模式通过隐藏系统的复杂性,向客户端提供了一个客户端可以访问系统的接口)
Builder模式:
OkHttpClient 比较复杂, 太多属性, 而且客户的组合需求多样化, 所以OKhttp使用建造者模式(Build模式使用多个简单的对象一步一步构建成一个复杂的对象,一个 Builder 类会一步一步构造最终的对象)
工厂模式:
Call接口提供了内部接口Factory(用于将对象的创建延迟到该工厂类的子类中进行,从而实现动态的配置。工厂方法模式。(工厂方法模式这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。)
享元模式:
在Dispatcher的线程池中,所用到了享元模式,一个不限容量的线程池 , 线程空闲时存活时间为 60 秒。线程池实现了对象复用,降低线程创建开销,从设计模式上来讲,使用了享元模式。(享元模式:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象,主要用于减少创建对象的数量,以减少内存占用和提高性能)
责任链模式:在okhttp中的拦截器模块,执行过程用到。OkHttp3 的拦截器链中, 内置了5个默认的拦截器,分别用于重试、请求对象转换、缓存、链接、请求服务器
策略模式 :
CacheInterceptor 实现了数据的选择策略, 来自网络还是来自本地? 这个场景也是比较契合策略模式场景, CacheInterceptor 需要一个策略提供者提供它一个策略, CacheInterceptor 根据这个策略去选择走网络数据还是本地缓存。
1.RetryAndFollowUpInterceptor (重定向拦截器)
在重定向拦截器中发起网络请求,如果网络请求出现异常会根据响应码进行重定向和重试,重定向时如果地址不一致会释放连接。如果没有异常则调起下一个拦截器。可参考:https://blog.csdn.net/chentaishan/article/details/103035168
2.BridgeInterceptor (桥接拦截器)
职责1:将构建的 Request 请求转换为能够进行网络访问的请求,添加用于网络请求的请求头信息
职责2:根据响应是否需要对Response 进行 gzip 压缩,具体是用 Okio 的库对 Response 进行压缩,并返回 Response
3.CacheInterceptor (缓存拦截器)
缓存拦截器根据request来判断cache中是否有缓存的response,如果有,得到这个response,然后进行判断当前response是否有效,如果无效则将cacheCandate赋值为空。根据request判断缓存的策略,决定是否要使用了网络,缓存,或两者都使用,然后调用下一个拦截器得到response,再然后决定是否缓存数据,如果本地已经存在cacheResponse,那么让它和网络得到的networkResponse做比较,决定是否来更新缓存的cacheResponse。
4.ConnectInterceptor (连接拦截器)
TCP协议需要需要建立连接才能进行通信,每次请求都建立连接会极大地影响通信效率。
连接拦截器优化了连接的建立,内部维护了可以重复使用的 Socket 连接池,减少握手次数,加快请求响应。
5.CallServerInterceptor(请求服务拦截器)
请求服务拦截器它负责实现网络IO,所有拦截器都要依赖它才能拿到响应数据。
1).建立一个临时表(数据格式与原表一样)
2).在表实体中,新增/删除/修改字段。
3).将表实体中的自动生成的构造方法以及getter/setter方法删除,重新Build—>Make Project进行生成。
4).修改Module下build.gradle中数据库的版本号schemaVersion ,递增加1,最后运行app
Fragment 有一个setUserVisibleHint()回调方法,Fragment结合 ViewPager使用时会起作用,滑动ViewPage则setUserVisibleHint方法会被调用,参数isVisibleToUser为true代表当前 Fragment 对用户可见,否则不可见。
在 Fragment 创建期间setUserVisibleHint()方法是在onCreateView()之前被调用,为了避免异常,在加载请求数据前做一个判断
Android中有4种数据存储方式,分别为文件存储、SQLite数据库、SharedPreferences、网络。每种存储方式的特点如下:
1)文件存储
文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供openFileInput()和openFileOutput()方法来读取设备上的文件。
2)SQLite数据库
SQLite是Android所集成的一个轻量级的嵌入式数据库,它不仅可以使用Andorid API操作,同时它也支持SQL语句进行增删改查等操作。
3)SharedPreferences
SharedPreferences用于存储一些简单配置信息,以文件的形式来保存数据。
4)网络存储数据
通过网络上提供的存储空间来上传或下载我们存储在网络空间中的数据信息
1.同步时主线程会阻塞,直到子线程通知主线程为止(先不考虑ANR);就是程序会呆板地从头执行到尾,耗时间的东西不执行完,程序不会继续往下走,等待时间长的话,会造成失去响应。
2.异步时主线程可以继续干其它的事情,当子线程完成任务通知一下主线程就可以了,类似于接口回调或消息队列的思想
3.异步的好处:把耗时间的东西扔到后台去运行(doInBackground),主程序可以继续做自己的事情,防止程序卡死。所以我一般在进行耗时操作的时候都会用异步操作
OSI 参考模型:
七层,主要分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP模型
四层:应用层、传输层、网络互联层、主机-网络层
但由于OSI模型太过庞大复杂,所以不太适合运用到实际使用中。所以我们关注TCP/IP模型就可以,它可以把实际运用的细节体现出来。下图,对比OSI模型和TCP/IP模型
Http协议和Https协议
http是超文本传输协议,协议的传输,都是明文传输,这就意味着,介于发送端和接收端之间的任意一个节点,都可以很轻松的获取到通信的报文信息,由于Http协议传输都是明文的,所以如果有需要,可以随时获取到一个用户和服务器交流的所有数据。所以会有大量的钓鱼网站对用户信息进行套取,不安全。
Http协议经过SSL/TLS加密后传输,成为HTTPS协议,Https是HTTP的安全升级版。
https协议需要到ca申请证书
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 - http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的。Https通过SSL认证,实现了服务器和客户端双向验证以确认对方身份。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议, 要比http协议安全。
Socket
通信的两端都要有Socket,是两台机器间通信的端点网络通信其实就是Socket间的通信。
Socket允许程序把网络连接当成一个流,数据在两个Socket 间通过IO传输。
一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
1.并发(concurrency),就是cpu在同一时刻执行多个任务。Java并发则由多线程实现。多线程会出现死锁和脏数据这种线程安全问题。
2.线程安全: 在多线程中,永远保证程序的正确性。只有存在共享数据时才需要考虑线程安全问题
3.解决机制
a) synchronized关键字,是实现线程同步的基本手段,被synchronized修饰的区域每次只有一个线程可以访问,达到线程安全的目的,底层实现是通过锁机制来保证,如下:
synchronized method(){} 同步方法
synchronized(object Reference) {} 同步代码块-对象锁
static synchronized method(){} 静态同步方法
synchronized(classname.class) 同步类锁
前两者是该对象锁,后两者是类锁。
b) 定义常量。final static等
c) 使用ReentrantLock可重入锁
当线程特别多的时候,可能会超出系统承载能力。而线程的创建和销毁非常耗费资源。如果在系统启动时就维持几个固定的线程,后面有新的任务到来就分配这些线程来执行操作,操作完成后继续等待新的任务,这些线程就组成了一个线程池。
通常利用Executors去创建不同配置的线程池, Executors提供了五种不同的线程池创建配置
① newCachedThreaPool(),用来处理大量短时间工作任务的线程池,它会试图缓存线程并重用,当无缓存线程可用时,会创建新的线程;当线程闲置的时间超过60秒,则被终止并移出缓存
② newFixedThreadPool(), 拥有固定线程数的线程池,线程池的大小,可以随意设置,也可以和cpu的核数量保持一致,
③ newSingleThreadExecutor(),线程数目为1,因此所有的任务是顺序执行
④ newSingleThreadScheduledExcutor()和newScheduleThreadPool(),可以定时或者周期性的工作调度,前者是单一工作线程,后者是多个工作线程
⑤ newWorkStealingPool(),Java8新特性,内部构建ForkJoinPool,利用Work-Stealing算法,并行的处理任务,不保证处理顺序
1、用Bundle的方式
在Android中三大组件(Activity,Service,Receiver)都支持在Intent中传递Bundle数据,由于Bundle实现了Parcelable接口(一种特有的序列化方法),所以它可以很方便的在不同的进程之间进行传输。
2、使用文件共享的方式
文件共享:将对象序列化之后保存到文件中,在通过反序列,将对象从文件中读取出来。此方式对文件的格式没有具体的要求,可以是文件、XML、JSON等
3、Content Provider
系统四大组件之一,可以共享数据给其他进程。自定义的ContentProvider注册时要提供authorities属性,应用需要访问的时候将属性包装成Uri.parse(“content://authorities”)。还可以设置permission,readPermission,writePermission来设置权限。 ContentProvider有query,delete,insert等方法,看起来貌似是一个数据库管理类,但其实可以用文件,内存数据等等一切来充当数据源,query返回的是一个Cursor,可以自定义继承AbstractCursor的类来实现。
4、AILDL
AIDL 是 Android Interface Definition Language 的缩写,意思是Android接口定义语言,用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。其使用可以简单的概括为服务端和客户端,类似于Socket 一样,服务端服务于所有客户端,支持一对多服务
/*
选择排序。
特点:
在内循环第一次结束,最值出现最低角标位。
*/
public static void selectSort(int[] arr)
{
for(int x=0; x
1、Android6.0部分新特性
运行时权限
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。
2、Android7.0部分新特性
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。
3、Android8.0部分新特性
通知适配
安卓8.0中,新增了通知渠道,用户可以根据渠道来屏蔽一些不想要的通知
安装APK
首先在AndroidManifest文件中添加安装未知来源应用的权限: 这样系统会自动询问用户完成授权。当然你也可以先使用 canRequestPackageInstalls()查询是否有此权限,如果没有的话使用Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES这个action将用户引导至安装未知应用权限界面去授权。
静态广播无法正常接收
问题原因: Android 8.0 引入了新的广播接收器限制,因此您应该移除所有为隐式广播 Intent 注册的广播接收器 解决方案: 使用动态广播代替静态广播
4、Android9.0部分新特性
Android P 禁止 App 使用所有未加密的连接(Http),因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输。
在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。如果向继续使用http网络请求的时候,需要在咱们的Manifest中添加networkSecurityConfig属性设置,继续使用http请求
Rxjava是一个基于事件流、实现异步操作的库,类似于Android中的AsyncTask,Handler的作用。Rxjava是一种扩展的观察者模式,整个模式中有4个角色:
concat操作符
Concat先读取缓存数据并展示UI再获取网络数据刷新UI。
1、concat 实现不交错的发射两个甚至多个Observable
2、只有前一个 Observable 终止(onComplete)才会订阅下一个 Observable,
3、多个Observable的泛型应当保持一致
map操作符
可以将Observable操作的数据类型进行转换,传入的参数为Function类型。
1.map回调中,拿到传进来的数据,进行随意转换后继续发射给下一级。
2.Function泛型第一个是传进来的参数,第二个是返回值的类型
flatMap操作符
类似map。FlatMap将一个Observable变换成多个Observable,将它们合并发射。不保证事件的顺序。
使用场景:多个网络请求依次依赖
1、注册用户前先通过接口A获取当前用户是否已注册,再通过接口B注册;
2、注册后自动登录,先通过注册接口注册用户信息,注册成功后马上调用登录接口进行自动登录。
concatMap操作符
concatMap和flatMap几乎一样,它能保证事件的顺序。
Flowable背压
Flowable返回值为Publisher或其实现类。Flowable是publisher的实现类,少写一个for循环,用了forArray()方法。解决背压问题
get http请求get方法
post http post 请求方法
Query QueryMap get请求方法的传参形式
Field FieldMap post 请求方法的传参形式
Path 请求地址以路径的形式来动态改变的情况使用path
Url 当使用特殊地址的时候,可以使用url
Header Headers 头部对象
mvc
模型层(Model) 业务逻辑及实体对象
视图层(View) xml 布局
控制层(Controller) activity或者是fragment
优点:分离业务逻辑层和控制层模块,避免activity代码臃肿复杂,代码清晰,便于维护。
mvp
模型层(Model)
视图层(View)
逻辑中间层(Presenter)model和view链接的桥梁
优点:解耦,降低模块之间的依赖。view由Activity承担,Presenter是view和model之间的桥梁,模块分层,结构清晰。
equals:如果是object 类型对比的内存地址值,如果是字符串,比较的是两个字符串的内容是否相同
" == " :比较的是两个对象的内存地址是 否相同
技术点:装箱、拆箱
参考回答:装箱就是自动将基本数据类型转换为包装器类型,拆箱就是自动将包装器类型转换为基本数据类型
技术点:基本数据类型、引用类型
参考回答:
Integer是int的包装类,int则是java的一种基本数据类型
Integer变量必须实例化后才能使用,而int变量不需要
Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
Integer的默认值是null,int的默认值是0
技术点:反射
思路:简述反射的定义、功能和应用,详见Java基础之泛型&反射
参考回答:
含义:在运行状态中,对于任意一个类都能知道它的所有属性和方法,对于任何一个对象都能够调用它的任何一个方法和属
性。
功能:动态性,体现在:在运行时判断任意一个类所具有的属性和方法; 在运行时判断任意一个对象所属的类;在运行时构
造任意一个类的对象;在运行时调用任意一个对象的方法;生成动态代理
应用:反射&泛型
技术点:内部类
思路:
参考回答:内部类就是定义在另外一个类里面的类。它隐藏在外部类中,封装性更强,不允许除外部类外的其他类访问它;
但它可直接访问外部类的成员。静态内部类和非静态内部类的区别有:
静态内部类是指被声明为static的内部类,可不依赖外部类实例化;而非静态内部类需要通过生成外部类来间接生成。
静态内部类只能访问外部类的静态成员变量和静态方法,而非静态内部类由于持有对外部类的引用,可以访问外部类的所用
成员
技术点:final、finally、finalize()
参考回答:
final关键字表示不可更改,具体体现在:
final修饰的变量必须要初始化,且赋初值后不能再重新赋值
final修饰的方法不能被子类重写
final修饰的类不能被继承
finally:和try、catch成套使用进行异常处理,无论是否捕获或处理异常,finally块里的语句都会被执行,在以下4种
特殊情况下,finally块才不会被执行:
在finally语句块中发生了异常
在前面的代码中用了System.exit()退出程序
程序所在的线程死亡
关闭CPU
finalize():是Object中的方法,当垃圾回收器将回收对象从内存中清除出去之前会调用finalize(),但此时并不代表 该回收对象一定会回收。
技术点:重写、重载
参考回答:重写表示子类重写父类的方法;重载表示有多个同名函数同时存在,区别在于有不同的参数个数或类型
引申:谈谈动态分派和静态分派
技术点:抽象类、接口
参考回答:
使用上的区别:一个类只能继承一个抽象类却可以实现多个接口
设计上的区别:接口是对行为的抽象,无需有子类的前提,是自上而下的设计理念;抽象类是对类的抽象,建立于相似子类
之上,是自下而上的设计理念
技术点:匿名内部类
参考回答:一方面,由于方法中的局部变量的生命周期很短,一旦方法结束变量就要被销毁,为了保证在内部类中能找到外
部局部变量,通过final关键字可得到一个外部变量的引用;另一方面,通过final关键字也不会在内部类去做修改该变量
的值,保护了数据的一致性。
技术点:Object
思路:列举常见的几个公有方法
参考回答:
equals(): 和==作用相似
hashCode():用于哈希查找,重写了equals()一般都要重写该方法
getClass(): 获取Class对象
wait():让当前线程进入等待状态,并释放它所持有的锁
notify()¬ifyAll(): 唤醒一个(所有)正处于等待状态的线程
toString():转换成字符串
技术点:集合框架
思路:分条解释每种类的特点
参考回答:可将Java集合框架大致可分为Set、List、Queue 和Map四种体系
Set:代表无序、不可重复的集合,常见的类如HashSet、TreeSet
List:代表有序、可重复的集合,常见的类如动态数组ArrayList、双向链表LinkedList、可变数组Vector
Map:代表具有映射关系的集合,常见的类如HashMap、LinkedHashMap、TreeMap
Queue:代表一种队列集合