【问题标题】:Coroutine Kotlin Android with Retrofit带有改造的协程 Kotlin Android
【发布时间】:2019-03-31 13:15:10
【问题描述】:
class Service{
    interface  RedditApi {
        @GET("/top.json")
        fun getTop(@Query("after") after: String,
                   @Query("limit") limit: String)
                : Deferred<Response<News>>;
    }
}
 val okHttpClient = OkHttpClient.Builder()
            .readTimeout(40, TimeUnit.SECONDS)
            .addInterceptor { chain ->
                val ongoing = chain.request().newBuilder()
                ongoing.addHeader("Cache-Control", "no-cache")
                ongoing.addHeader("User-Agent", System.getProperty("http.agent"))
                //ongoing.addHeader("Authorization", val.trim());
                chain.proceed(ongoing.build())
            }
            .connectTimeout(40, TimeUnit.SECONDS)
            .build()
        val retrofit = Retrofit.Builder()
            .baseUrl( "/rest/s1/mobile/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .client(okHttpClient)
            .build()
        redditApi = retrofit.create(Service.RedditApi::class.java)

好吧,我知道了,我正在尝试对 Coroutine 进行改造。我去我的活动并像下面那样实现它。我得到错误 dispatchers.main unresolved reference main。我使用的是 kotlin 1.3.21。另外我的另一个问题是,如果用户单击活动,我该如何取消协程操作?就像在 Java 中,我曾经用改造来做 call.cancel()。它取消了调用。

class MainActivity : AppCompatActivity(), Fightable {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)


            CoroutineScope(Dispatchers.IO).launch {
                val request = App.redditApi.getTop("after", "limit")
                withContext(Dispatchers.Main) {
                    try {
                        val response = request.await()
                        if (response.isSuccessful) {
                            val news: News? = response.body()
                            //Do something with response e.g show to the UI.
                        } else {
                        }
                    } catch (e: HttpException) {
                    } catch (e: Throwable) {
                    }
                }
            }}}

【问题讨论】:

  • Dispatchers.Main不在核心协程库中,而是在kotlinx-coroutines-android中。
  • 是的,谢谢,我导入了实现“org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.0-alpha”让它工作。

标签: android kotlin kotlin-coroutines


【解决方案1】:

您需要创建协程上下文的单个实例,并为其定义一个作业。 val job = Job() val coroutineScope = CoroutineContext(Dispatchers.Main+job)

并使用声明的范围开始工作,当您想取消工作时,您只需调用job.cancel() 即可取消所有当前和即将进行的工作。

【讨论】:

  • 嗨,假设我将 url 调用到服务器端。然后调用cancel。服务器端的工作也会被取消吗?因为这就是我想要的。
  • 如果你猜你取消正在进行的请求,服务器将停止发送数据。大多数情况下它应该。尝试取消改造请求。
猜你喜欢
  • 2020-01-21
  • 2020-02-22
  • 2021-12-07
  • 2019-11-28
  • 2022-01-07
  • 2021-11-01
  • 1970-01-01
  • 2018-11-06
  • 2018-05-18
相关资源
最近更新 更多