无法弄清楚为什么会这样.我的调用不会触发任何一个rx回调(onCompleted(),onError(),onNext()).我收到的唯一的东西是这个okhttp输出:
D/OkHttp: --> GET https://api.privatbank.ua/p24api/exchange_rates?json=true&date=20.11.2016 http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- HTTP FAILED: java.io.IOException: Canceled
Run Code Online (Sandbox Code Playgroud)
改造模块:
@Module
public class RestModule {
@Provides
@Singleton
public HttpLoggingInterceptor providesHttpLogginInterceptor() {
return new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
}
@Provides
@Singleton
public OkHttpClient providesOkHttpClient(@NonNull HttpLoggingInterceptor loggingInterceptor) {
return new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.connectTimeout(ConstantsManager.CONNECTION_TIME_OUT, TimeUnit.SECONDS)
.readTimeout(ConstantsManager.READ_TIME_OUT, TimeUnit.SECONDS)
.build();
}
@Provides
@Singleton
public Gson providesGson() {
return new GsonBuilder().create();
}
@Provides
@Singleton
public Retrofit providesRetrofit(@NonNull OkHttpClient okHttpClient, @NonNull Gson gson) {
return new Retrofit.Builder()
.baseUrl(ConstantsManager.BASE_URL)
.client(okHttpClient)
.addConverterFactory(SimpleXmlConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build(); …Run Code Online (Sandbox Code Playgroud) 我对协程相对较新,所以我想知道如何解决我的本地小问题而不需要大量重组我的 Android 代码。
这是一个简单的设置。我的 ViewModel 从存储库调用一个suspend函数:
// ...ViewModel.kt
fun loadData() {
viewModelScope.launch {
val data = dataRepository.loadData()
}
}
Run Code Online (Sandbox Code Playgroud)
这非常方便,因为我已经viewModelScope为 Android 准备好了一个,并且我从我的存储库中调用了一个挂起函数。我不关心存储库如何加载数据,我只是暂停直到它返回给我。
我的数据存储库使用以下命令进行多次调用Retrofit:
//...DataRepository.kt
@MainThread
suspend fun loadData(): ... {
// Retrofit switches the contexts for me, just
// calling `suspend fun getItems()` here.
val items = retrofitApi.getItems()
val itemIDs = items.map { it.id }
// Next, getting overall list of subItems for each item. Again, each call and context
// switch for `suspend …Run Code Online (Sandbox Code Playgroud) 我在通过 Android Studio 以调试模式运行 Android 应用程序时遇到协程异常。
kotlinx.coroutines.JobCancellationException:StandaloneCoroutine 已取消
从协程调试文档中,我了解到,通过启用协程的调试模式,我可能会获得更完整的堆栈跟踪信息。
它可以通过设置系统属性 DEBUG_PROPERTY_NAME 或通过运行带有启用断言(-ea 标志)的 Java 来启用。
这就是我被困住的地方。在 Android Studio 中实现此目的的惯用方法是什么?我的项目是使用 Gradle 配置的,并且在 Windows 上运行。理想情况下,有一种方法可以通过 Gradle 配置进行配置,以便任何通过源代码控制拉入此项目的人都可以启用协程调试模式。
我阅读了所有kotlinx UI 文档并实现了一个像那里描述的 ScopedActivity(见下面的代码)。
在我的 ScopedActivity 实现中,我还添加了一个 CouroutineExceptionHandler,尽管我将异常处理程序传递给了我的所有协程,但我的用户遇到了崩溃,我在堆栈跟踪中获得的唯一信息是“作业已取消”。
我现在搜索了几天,但我没有找到解决方案,我的用户仍然随机崩溃,但我不明白为什么......
这是我的 ScopedActivity 实现
abstract class ScopedActivity : BaseActivity(), CoroutineScope by MainScope() {
val errorHandler by lazy { CoroutineExceptionHandler { _, throwable -> onError(throwable) } }
open fun onError(e: Throwable? = null) {
e ?: return
Timber.i(e)
}
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
Run Code Online (Sandbox Code Playgroud)
这是实施它的活动的示例:
class ManageBalanceActivity : ScopedActivity() {
@Inject
lateinit var viewModel: ManageBalanceViewModel
private var stateJob: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_balance) …Run Code Online (Sandbox Code Playgroud)