Android(12)——OkHttp网络操作框架,EventBus事件总线

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”));

把in.txt拷贝到out.txt:

1.3 OkHttp

➢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 组件通信之本地广播

2.3 EventBus

或者

事件,订阅(注册、处理),发布

使用步骤:
1.定义事件,就是普通的java对象(Success.java),可以加任何成员变量、方法,携带信息;
2.订阅方:注册到EventBus中

3.发布方

2.4 线程模式

  1. Thread
    ➢MAIN(UI) 线程
    ➢后台线程:可做耗时操作,不可更新页面

  2. 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 配置

在代码中并没有使用这个方法,而是在动态反射使用的。

混淆规则的设置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章