文章目录
Android
安卓开发者指南:https://developer.android.google.cn/guide
1 Okio & OkHttp
1.1 Okio简介
I/O
➢java.io
➢java.nio
➢okio:okio-1.12.0.jar
作用:访问数据、存储数据、处理数据
掌握传输数据的方法
1.2 Okio的核心类
1.2.1 Okio-ByteString
String、ByteString
创建ByteString
●okio.ByteString of(byte… data)
●okio.ByteString encodeUtf8(String str)
●okio.ByteString decodeHex(String hex)
●okio.ByteString decodeBase64(String base64)
● okio.ByteString read(InputStream in,int byteCount)
ByteString常用方法
●okio.ByteString#base64
●okio.ByteString#hex
●okio.ByteString#md5
●okio.ByteString#sha1
●okio.ByteString#write(java.io.OutputStream)
okio是个jar包,可以在AS、idea上测试,这里在idea上测试:
1.2.2 Okio-Buffer
输入流
Source
➢read(Buffer sink, long byteCount)
➢timeout()
➢close()
输出流
Sink
➢write(Buffer source, long byteCount)
➢flush()
➢timeout()
➢close()write
Buffer类
➢okio.BufferedSource
➢okio.BufferedSink
方法:
buffer.readFrom(new FileInputStream(“in.png”));
buffer.writeTo(new FileOutputStream(“out.png”));
![](https://i-blog.csdnimg.cn/blog_migrate/7cd7d6262abdd793a223657b52e7994c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/acb6abfdaab93936b0a45261aab45558.png)
![](https://i-blog.csdnimg.cn/blog_migrate/22346aa314ed838752d291809a7eb96a.png)
把in.txt拷贝到out.txt:
1.3 OkHttp
![](https://i-blog.csdnimg.cn/blog_migrate/7720ee61a80a01381b036e9a6293fcb6.png)
➢Apache HttpClient
➢HttpURLConnection
➢OkHttp:okhttp-3.7.0.jar
OkHttpClient mClient = new OkHttpClient();
1.4 OkHttp核心类
OkHttp客户端做两件事:请求,响应
Request
➢URL
➢method
➢headers
➢body
Get
Request.Builder builder = new Request.Builder();
builder.ur1(“http: //httpbin. org/get”);
Request request = builder.build();
Call
Call call = client.newCall(request);
Response response = call.execute();
Response
➢code
➢headers
➢body
Callback
Callback callback = new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
};
HttpUrl
HttpUr1.Builder builder = HttpUr1.parse( "https:/ /httpbin .org/").newBuilder();
builder.addEncodedPathSegment("get");
builder.addEncodedQueryParameter("show_ env", "1" );
HttpUrl httpUr1 = builder.build();
Post
Request request = new Request.Builder()
.ur1("https://api.github.com/markdown/raw")
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))
.build();
demo:
1.加入网络的权限:< uses-permission android:name=“android.permission.INTERNET”/>
2.OkHttp-get-Rquest
3.OkHttp-get-Response
4.OkHttp-post
2 EventBus事件总线
EventBus是以观察者模式实现的事件总线,通过发布 / 订阅方式来管理事件总线。简化了组件间以及组件与后台线程间的通信。可以实现线程间的切换,包括后台线程、UI线程、异步线程。
2.1 组件通信之监听
发送方----订阅方,用EventBus进行事件的订阅和发布
Fragment消息发送方,Activity消息接收方
发送:
接收:
在订阅方的时候,设置监听器
弊端:定义接口(增加的话就会新增很多接口);添加一个setEventListener方法(事件的发布方和订阅方耦合在一起,依赖性高了);
2.2 组件通信之本地广播
![](https://i-blog.csdnimg.cn/blog_migrate/ad74aa4724aef2b12ec8392450a449c0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5496c7bb9b07c258733113394bb32ca8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d66929a7fad61256df7895acaf9c8b9.png)
2.3 EventBus
或者
事件,订阅(注册、处理),发布
![](https://i-blog.csdnimg.cn/blog_migrate/5728f451f9d19d3fe4808275ff78febf.png)
使用步骤:
1.定义事件,就是普通的java对象(Success.java),可以加任何成员变量、方法,携带信息;
2.订阅方:注册到EventBus中
3.发布方
2.4 线程模式
-
Thread
➢MAIN(UI) 线程
➢后台线程:可做耗时操作,不可更新页面 -
ThreadMode
➢POSTING
➢MAIN
➢MAIN_ORDERED
➢BACKGROUND
➢ASYNC
posting:默认,发布和订阅事件在同一个线程
发布方:
main:订阅回调函数一定在主线程,可以大胆更新界面;可能造成阻塞发布者
main_ordered:回调函数在主线程
main中发布方会被订阅方阻塞,在main_ordered中后续会立即执行,事件的发布方不会被订阅方阻塞。
background:如果发布者运行在主线程下,EventBus就会创建一个单独的后台线程来呼叫订阅函数;如果事件处理函数运行在非UI(后台)线程下,就直接呼叫订阅函数,订阅函数就会阻塞
1.创建事件类型,新建类BackgroundEvent,添加属性String threadInfo,构造函数
2.事件定义函数,回调函数
3.发布事件:
async:事件处理函数运行在非UI线程下,进行耗时操作;订阅方始终是在独立的线程中运行,如耗时的网络操作就可以使用这个模式。
1.创建事件类型,新建类AsyncEvent,添加属性String threadInfo,构造函数
2.事件定义函数,回调函数,类似于上一种
3.发布方:
2.5 粘性事件
Sticky
1.定义事件类型:SticktyMessageEvent,添加属性String threadInfo,构造函数
2.发布粘性事件
3.目标Activity中订阅
2.6 配置
在代码中并没有使用这个方法,而是在动态反射使用的。
混淆规则的设置。