1.依赖
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2'
implementation "com.squareup.retrofit2:retrofit:2.6.2"
implementation "com.squareup.retrofit2:converter-gson:2.6.2"
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.okhttp3:okhttp:4.4.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.14.2'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
2.Retrofit工具类
import android.util.Log
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
object RFUtil {
fun rf(baseurl: String): Retrofit {
val builder = OkHttpClient.Builder()
builder.connectTimeout(20, TimeUnit.SECONDS)
builder.readTimeout(20, TimeUnit.SECONDS)
builder.writeTimeout(20, TimeUnit.SECONDS)
//添加统一请求头
builder.addInterceptor {
val request = it.request()
val requestBuilder: Request.Builder = request.newBuilder()
requestBuilder
.addHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
.addHeader(
"Authorization",
"*************************************************"
)
.addHeader("Content-Type", "application/json")
val newRequest = requestBuilder.build()
it.proceed(newRequest)
}
builder.addInterceptor(
HttpLoggingInterceptor(HttpLoggingInterceptor.Logger {
Log.d("result-->", it)
}).setLevel(HttpLoggingInterceptor.Level.BODY)
).retryOnConnectionFailure(false)
return Retrofit.Builder()
.client(builder.build())
.baseUrl(baseurl)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
添加统一请求头:
object RFUtil {
val rf: Retrofit by lazy {
val builder = OkHttpClient.Builder()
builder.connectTimeout(20, TimeUnit.SECONDS)
builder.readTimeout(20, TimeUnit.SECONDS)
builder.writeTimeout(20, TimeUnit.SECONDS)
//添加统一请求头
builder.addInterceptor {
val request = it.request()
val requestBuilder: Request.Builder = request.newBuilder()
requestBuilder.addHeader("Content-Type", "application/json;charset=UTF-8")
.addHeader("x-versionname", BuildConfig.VERSION_NAME)
.addHeader("x-versioncode", "${BuildConfig.VERSION_CODE}")
val newRequest = requestBuilder.build()
it.proceed(newRequest)
}
//日志
builder.addInterceptor(
HttpLoggingInterceptor(HttpLoggingInterceptor.Logger {
Log.d("result-->", it)
}).setLevel(HttpLoggingInterceptor.Level.BODY)
)
builder.retryOnConnectionFailure(false)
Retrofit.Builder()
.client(builder.build())
.baseUrl(Const.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
3.service
object Const {
const val BASE_URL = "http://***.***.***.***:**/auto/back/orderSale/"
interface OrderApi {
@POST("PDA/pickOrderSaleListDetail.do")
@FormUrlEncoded
suspend fun order(
@Field("orderId") orderId: String,
@Field("status") status: Int
): Order
}
}
4.使用
class MainActivity : AppCompatActivity() {
private val viewModel by lazy { ViewModelProvider(this).get(MainVM::class.java) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
loading.show()
viewModel.getorder().observe(this, orderobserver)
}
}
private val orderobserver = Observer<Order> {
loading.hide()
textView.text = it.toString()
}
}
class MainVM : ViewModel() {
private val orderinfo by lazy { MutableLiveData<Order>() }
fun getorder(): MutableLiveData<Order> {
//协程理解,可suspend,且不阻塞线程
Jobutil.scope.launch {
try {
val order = RFUtil.rf.create(Const.OrderApi::class.java)
.pickOrderSaleListDetail("A01_OUT20200104031", 0)
orderinfo.value = order
Jobutil.io("nihao")
Log.i("result1-->", "thread:${Thread.currentThread().name}")
} catch (e: Exception) {
}
}
return orderinfo
}
}
5.工具类封装
object Jobutil {
val scope: CoroutineScope by lazy { CoroutineScope(Dispatchers.Main) }
suspend fun <T> io(id: T, type: Int = 0) = withContext(Dispatchers.IO) {
when (type) {
0 -> {
val id1 = id as String
Log.i("result-->", "thread之前:${Thread.currentThread().name},id:${id1}")
delay(1000)
Log.i("result-->", "thread:${Thread.currentThread().name},id:$id1")
}
else -> {
}
}
}
}
class MainVM : ViewModel() {
private val orderinfo by lazy { MutableLiveData<Order>() }
fun getorder(): MutableLiveData<Order> {
//协程理解,可suspend,且不阻塞线程。轻量级线程
Jobutil.scope.launch {
try {
val order = RFUtil.rf.create(Const.OrderApi::class.java)
.pickOrderSaleListDetail("A01_OUT20200104031", 0)
orderinfo.value = order
Jobutil.io("nihao")
delay(1000)
Jobutil.io("ok")
Log.i("result-->", "thread:${Thread.currentThread().name}")
} catch (e: Exception) {
}
}
return orderinfo
}
}
6.总结
协程理解,可suspend,且不阻塞线程。轻量级线程