Retrofit+协程+线程调度

1,314 阅读1分钟

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,且不阻塞线程。轻量级线程