Skip to content

Commit

Permalink
升级到1.3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
39251474 committed Aug 4, 2021
1 parent 787c5ce commit 4b462f0
Show file tree
Hide file tree
Showing 13 changed files with 60 additions and 80 deletions.
2 changes: 1 addition & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .idea/jarRepositories.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 0 additions & 10 deletions .idea/runConfigurations.xml

This file was deleted.

6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## [1.3.0] - 2021/8/4

* 最终执行网络请求的方法由`call.execute`修改为`call.enqueue`
* 不再切换协程上下文到IO调度器执行网络请求,现在全生命周期都在`execute`方法指定的调度器中执行
* 升级AGP到7.0.0

## [1.2.0] - 2021/7/6

* 修复空请求体请求失败bug
Expand Down
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,7 @@ fun main() = runBlocking{
val work = LoginWork("cwk","123456")
// 最简单的启动方式,在协程作用域内启动,以同步的方式书写异步请求和响应,充分利用协程优势
// 默认的Work会在[Dispatchers.IO]中执行,如果要控制Work工作上下文,请传入[CoroutineContext],
// 尽管可以控制Work的基础生命周期的工作[CoroutineContext]但是实际执行网络请求的部分生命周期依然会在[Dispatchers.IO]中执行。
// 默认的Work会在[Dispatchers.IO]中执行,如果要控制Work工作上下文,请传入[CoroutineContext]
var data = work.start() // data为AppWorkData<User>类型
if (data.success){
Expand Down
10 changes: 5 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ android {

dependencies {

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'

testImplementation 'junit:junit:4.+'
testImplementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0'

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1"

implementation project(':work')
}
7 changes: 3 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.5.20"
ext.kotlin_version = "1.5.21"
repositories {
mavenCentral()
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'com.android.tools.build:gradle:7.0.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.30.0"
Expand All @@ -18,8 +17,8 @@ buildscript {

allprojects {
repositories {
mavenCentral()
google()
jcenter()
}
}

Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
8 changes: 4 additions & 4 deletions work/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ android {
defaultConfig {
minSdkVersion 19
targetSdkVersion 30
versionCode 3
versionName "1.2.0"
versionCode 4
versionName "1.3.0"
}

buildTypes {
Expand All @@ -29,8 +29,8 @@ android {
}

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1"
api 'com.squareup.okhttp3:okhttp:4.9.1'
}

Expand Down
41 changes: 21 additions & 20 deletions work/src/main/java/org/cwk/work/Work.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package org.cwk.work

import kotlinx.coroutines.*
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.IOException
import kotlin.coroutines.CoroutineContext
Expand All @@ -16,9 +17,7 @@ import kotlin.coroutines.resumeWithException
* 可以启动网络请求
* 任务流程依赖协程实现,同样遵循通过协程取消任务
*
* 所有方法默认在[Dispatchers.IO]中执行,
* 可通过[execute]参数改变协程上下文,
* 部分网络请求关联的生命周期总是在[Dispatchers.IO]中执行
* 所有方法默认在[Dispatchers.IO]中执行,可通过[execute]参数改变协程上下文
*
* 此类为任务基础模板,需要用户在项目中根据实际的业务http通用协议实现自己的基类并进一步继承实现各个接口[Work]
*
Expand Down Expand Up @@ -123,10 +122,8 @@ abstract class Work<D, T : WorkData<D>, H> : WorkCore<D, T, H>() {
}.let { call ->
logI(_tag, "real url", call.request().url)

withContext(Dispatchers.IO + CoroutineName(_tag)) {
onCall(data, call).use {
onHandleResponse(data, it)
}
onCall(data, call).use {
onHandleResponse(data, it)
}
}
}
Expand All @@ -140,22 +137,26 @@ abstract class Work<D, T : WorkData<D>, H> : WorkCore<D, T, H>() {
call.cancel()
}

try {
it.resume(call.execute())
} catch (e: IOException) {
if (it.isCancelled) {
return@suspendCancellableCoroutine
call.enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
it.resume(response)
}

logD(_tag, "onNetworkError")
it.resumeWithException(
WorkException(
if (e.message == "timeout") WorkErrorType.TIMEOUT else WorkErrorType.NETWORK,
onNetworkError(data),
e,
override fun onFailure(call: Call, e: IOException) {
if (it.isCancelled) {
return
}

logD(_tag, "onNetworkError")
it.resumeWithException(
WorkException(
if (e.message == "timeout") WorkErrorType.TIMEOUT else WorkErrorType.NETWORK,
onNetworkError(data),
e,
)
)
)
}
}
})
}

/**
Expand Down
24 changes: 2 additions & 22 deletions work/src/main/java/org/cwk/work/WorkCore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ import kotlin.coroutines.CoroutineContext
/**
* [Work]核心生命周期
*
* 所有的生命中周期方法默认在[Dispatchers.IO]中执行,
* 可通过[execute]参数改变协程上下文,
* 部分网络请求关联的生命周期总是在[Dispatchers.IO]中执行
* 所有的生命周期方法默认在[Dispatchers.IO]中执行,可通过[execute]参数改变协程上下文
*
* @param D 关联的[Work]实际返回的[WorkData.result]结果数据类型
* @param T [Work]返回的结果包装类型[WorkData]
Expand All @@ -25,7 +23,7 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
* 执行任务
* 任务的执行完全依赖协程,同样支持协程取消规范
*
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程,其中部分网络请求关联方法总是在[Dispatchers.IO]中执行
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param onSendProgress 发送/上传进度监听器,在[httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效
* @param onReceiveProgress 接收/下载进度监听器
Expand Down Expand Up @@ -239,8 +237,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
/**
* 转换OkHttp请求结果数据[ResponseBody]到用户定义的[H]类型数据
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
* @param body 请求成功响应的数据体,无需执行[ResponseBody.close],框架会负责关闭
*
Expand All @@ -255,8 +251,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
*
* http响应成功时判断本次业务请求真正的成功或失败结果
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
* @param response 经由[onResponseConvert]转换后的数据结果
*
Expand All @@ -269,8 +263,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
*
* 在服务请求成功后调用,即[onRequestResult]返回值为true时被调用
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
* @param response 经由[onResponseConvert]转换后的数据结果
*
Expand All @@ -283,8 +275,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
*
* 在服务请求成功后调用,即[onRequestResult]返回值为true时被调用
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
* @param response 经由[onResponseConvert]转换后的数据结果
*
Expand All @@ -297,8 +287,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
*
* 在服务请求失败后调用,即[onRequestResult]返回值为false时被调用
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
* @param response 经由[onResponseConvert]转换后的数据结果
*
Expand All @@ -311,8 +299,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
*
* 在服务请求失败后调用,即[onRequestResult]返回值为false时被调用
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
* @param response 经由[onResponseConvert]转换后的数据结果
*
Expand All @@ -325,8 +311,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
*
* 即在[Work.onParse]返回false时调用
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
*
* @return 响应数据解析失败时的消息,将会设置给[WorkData.message]
Expand All @@ -338,8 +322,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
*
* 即响应码不是2xx,如4xx,5xx等
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
*
* @return 服务器响应错误时的消息,将会设置给[WorkData.message]
Expand All @@ -349,8 +331,6 @@ abstract class WorkCore<D, T : WorkData<D>, H> {
/**
* 网络连接建立失败时调用,即网络不可用
*
* @suppress 此生命周期总是在[Dispatchers.IO]中执行,即不受[execute]的[CoroutineContext]参数影响
*
* @param data 本次请求中流转的数据
*
* @return 网络无效时的消息,将会设置给[WorkData.message]
Expand Down
20 changes: 10 additions & 10 deletions work/src/main/java/org/cwk/work/WorkExecute.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import kotlin.coroutines.EmptyCoroutineContext
* 推荐使用
*
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程,其中部分网络请求关联方法总是在[Dispatchers.IO]中执行
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param sendProgressChannel 发送/上传进度的通道,参数为进度百分比,任务结束后会自动关闭通道,在[Work.httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效,
* @param receiveProgressChannel 接收/下载进度监听器,参数为进度百分比,任务结束后会自动关闭通道
* @param receiveProgressChannel 接收/下载进度的通道,参数为进度百分比,任务结束后会自动关闭通道
*
* @return 包含执行结果的包装类[T]
*/
Expand Down Expand Up @@ -51,7 +51,7 @@ suspend fun <D, T : WorkData<D>, H> Work<D, T, H>.start(
* 任务的执行完全依赖协程,同样支持协程取消规范
*
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程,其中部分网络请求关联方法总是在[Dispatchers.IO]中执行
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param onSendProgress 发送/上传进度监听器,在[Work.httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效
*
* @return 包含执行结果的包装类[T]
Expand All @@ -68,7 +68,7 @@ suspend fun <D, T : WorkData<D>, H> Work<D, T, H>.upload(
*
* @param channel 发送/上传进度的通道,参数为进度百分比,任务结束后会自动关闭通道,在[Work.httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效,
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程,其中部分网络请求关联方法总是在[Dispatchers.IO]中执行
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
*
* @return 包含执行结果的包装类[T]
*/
Expand All @@ -92,7 +92,7 @@ suspend fun <D, T : WorkData<D>, H> Work<D, T, H>.upload(
* 任务的执行完全依赖协程,同样支持协程取消规范
*
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程,其中部分网络请求关联方法总是在[Dispatchers.IO]中执行
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param onReceiveProgress 接收/下载进度监听器
*
* @return 包含执行结果的包装类[T]
Expand All @@ -109,7 +109,7 @@ suspend fun <D, T : WorkData<D>, H> Work<D, T, H>.download(
*
* @param channel 接收/下载进度监听器,参数为进度百分比,任务结束后会自动关闭通道
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程,其中部分网络请求关联方法总是在[Dispatchers.IO]中执行
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
*
* @return 包含执行结果的包装类[T]
*/
Expand All @@ -134,7 +134,7 @@ suspend fun <D, T : WorkData<D>, H> Work<D, T, H>.download(
* 此模式为启动协程+执行任务的组合快捷方式
*
* @param coroutineScope 指定协程作用域,如果为null将使用[MainScope]作用域并在任务结束时取消
* @param context 协程上下文
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param start 协程启动选项,参考[CoroutineScope.launch]
* @param onSendProgress 发送/上传进度监听器,在[Work.httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效
Expand Down Expand Up @@ -170,7 +170,7 @@ fun <D, T : WorkData<D>, H> Work<D, T, H>.launch(
* 此模式为启动协程+执行任务的组合快捷方式
*
* @param coroutineScope 指定协程作用域,如果为null将使用[MainScope]作用域并在任务结束时取消
* @param context 协程上下文
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param start 协程启动选项,参考[CoroutineScope.launch]
* @param sendProgressChannel 发送/上传进度的通道,参数为进度百分比,任务结束后会自动关闭通道,在[Work.httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效,
Expand Down Expand Up @@ -220,7 +220,7 @@ fun <D, T : WorkData<D>, H> Work<D, T, H>.launchWithChannel(
* 此模式为启动协程+执行任务的组合快捷方式
*
* @param coroutineScope 指定协程作用域,如果为null将使用[MainScope]作用域并在任务结束时取消
* @param context 协程上下文
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param start 协程启动选项,参考[CoroutineScope.async]
* @param onSendProgress 发送/上传进度监听器,在[Work.httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效
Expand Down Expand Up @@ -256,7 +256,7 @@ fun <D, T : WorkData<D>, H, R> Work<D, T, H>.async(
* 此模式为启动协程+执行任务的组合快捷方式
*
* @param coroutineScope 指定协程作用域,如果为null将使用[MainScope]作用域并在任务结束时取消
* @param context 协程上下文
* @param context 协程上下文,影响[Work]各生命周期方法的执行线程
* @param retry 请求失败重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推
* @param start 协程启动选项,参考[CoroutineScope.async]
* @param sendProgressChannel 发送/上传进度的通道,参数为进度百分比,任务结束后会自动关闭通道,在[Work.httpMethod]为[HttpMethod.GET]和[HttpMethod.HEAD]时无效,
Expand Down

0 comments on commit 4b462f0

Please sign in to comment.