建表: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对象传入数据(不推荐传非基本类型的)
2.2从Fragment到Activity**两种方式:
1.在Fragment调用getActivity()返回这个Fragment的Activity对象,然后强转,调用activity方法直接传值MainActivity activity = (MainActivity )getActivity();
activity.sendMsg("内容");
2.在Fragment中创建一个接口 然后由创建这个Fragment的Activity实现这个接口就可以让Fragment传值到Activity了
2.3 从Fragment到Fragment**
1.以FragmentManeage调用findFragmentById(“ID”),或者ByTag()也可以
2.用FragmentManeage获取到Fragment的集合getFragments(),然后手动遍历判断集合的Fragment是否是需要的Fragmeng然后调用方法传值
3. Activity以及Fragment常用生命周期以及对应的作用(10分钟)
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 根据这个策略去选择走网络数据还是本地缓存。
5. 列举一下Ok中的拦截器以及作用
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(boolean isVisibleToUser)回调方法,当 ViewPager 嵌套 Fragment 时会起作用,如果切换 ViewPager 则setUserVisibleHint方法也会被调用,参数isVisibleToUser为true代表当前 Fragment 对用户可见,否则不可见。
8. RecycleView与ListView的区别? RecyclerView规范化了ViewHolder的编写,ListView是需要自己定义的 RecyclerView复用item全部搞定,不需要想ListView那样setTag()与getTag(); RecyclerView多了一些LayoutManager工作,但实现了布局效果多样化4.ListView 的只能纵向效果,recyclerview可以水平和垂直
5.ListView有addheaderView()和addFooterView(),recyclerview 没有
6.ListView有点击事件,recyclerview没有
7.ListView默认有间隔线,recyclerview需要手动添加
8.ListView实现动画很复杂,recyclerview很轻松 9. 说一下Android中数据存储的几种方式
Android中有4种数据存储方式,分别为文件存储、SQLite数据库、SharedPreferences、网络。每种存储方式的特点如下:
1)文件存储
文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供openFileInput()和openFileOutput()方法来读取设备上的文件。
2)SQLite数据库
SQLite是Android所集成的一个轻量级的嵌入式数据库,它不仅可以使用Andorid API操作,同时它也支持SQL语句进行增删改查等操作。
3)SharedPreferences
SharedPreferences用于存储一些简单配置信息,以文件的形式来保存数据。
4)网络存储数据
通过网络上提供的存储空间来上传或下载我们存储在网络空间中的数据信息
同步是阻塞式的;
而异步的时候主线程可以继续干其它的事情,当子线程完成任务的时候通知主线程就可以了,类似于接口回调或消息队列的思想
同步执行任务是按照代码先后顺序执行,
异步执行任务是任务在其他线程里执行,执行完后返回结果。
同步请求需要主线程参与,会阻塞主线程,异步请求不需要主线程参与,不会阻塞主线程,所以我一般在进行耗时操作的时候都会用异步操作
OSI 参考模型:
七层,主要分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层TCP/IP模型
四层:应用层、传输层、网络互联层、主机-网络层但由于OSI模型太过庞大复杂,所以不太适合运用到实际使用中。所以我们关注TCP/IP模型就可以,它可以把实际运用的细节体现出来。下图,对比OSI模型和TCP/IP模型
应用层:应用层确定了数据传输后的操作。应用层协议如 HTTP,还有用于电子邮件的 SMTP,POP ,IMAP用于文件传输的 FTP、FSP 和 TFTP;用于文件访问的 NFS等协议 传输层:使得源主机和目标主机上的进程可以进行会话。定义两种不同的协议:TCP UDP 协议。 网络互联层: 把IP数据包发送给目标主机,为了尽快发送数据,IP协议把原始数据分为多个数据包,然后沿不同路径同时传递数据包。 主机网络层:为上层(网络互联层)提供一个访问接口,使得网络互联层能利用主机网络层来传递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修饰的区域每次只有一个线程可以访问,达到线程安全的目的,底层实现是通过锁机制来保证,如下:
sychronized method(){}
sychronized (object Reference) {}
static synchronized method(){}
sychronized(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<arr.length-1; x++)
{
for(int y=x+1; y<arr.length; y++)
{
if(arr[x]<arr[y])
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp
}
}
}
}
16. 聊一下Android中的6 7 8 9新特性对开发的影响
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个角色:
被观察者(Observable),用来产生事件。 观察者(Observer),用来接收事件,并给出响应动作。 订阅(Subscribe),用来连接被观察者和观察者。 事件(Event),作为被观察者和观察者沟通的载体。Rxjava的执行流程,被观察者(Observable)通过订阅(Subscribe)按顺序发送事件给观察者(Observer),观察者(Observer)按顺序接收事件和作出对应的响应动作。 18. 说一下RxJava几个常用操作符用法以及应用场景
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()方法。解决背压问题 19. 写出Retrofit常用注解至少6个,注解写法以及中文解释
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之间的桥梁,模块分层,结构清晰。
作者:名字是真的不好起