相关疑难解决方法(0)

Retrofit API调用收到"HTTP FAILED:java.io.IOException:Cancelled"

无法弄清楚为什么会这样.我的调用不会触发任何一个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 rx-java rx-android retrofit2 okhttp3

24
推荐指数
1
解决办法
1万
查看次数

从 Android 中的挂起函数并行调用 Kotlin 协程

我对协程相对较新,所以我想知道如何解决我的本地小问题而不需要大量重组我的 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 kotlin kotlin-coroutines

8
推荐指数
1
解决办法
1万
查看次数

从 Android Studio 运行 Android 应用程序时如何启用协程调试模式?

我在通过 Android Studio 以调试模式运行 Android 应用程序时遇到协程异常。

kotlinx.coroutines.JobCancellationException:StandaloneCoroutine 已取消

协程调试文档中,我了解到,通过启用协程的调试模式,我可能会获得更完整的堆栈跟踪信息。

它可以通过设置系统属性 DEBUG_PROPERTY_NAME 或通过运行带有启用断言(-ea 标志)的 Java 来启用。

这就是我被困住的地方。在 Android Studio 中实现此目的的惯用方法是什么?我的项目是使用 Gradle 配置的,并且在 Windows 上运行。理想情况下,有一种方法可以通过 Gradle 配置进行配置,以便任何通过源代码控制拉入此项目的人都可以启用协程调试模式。

gradle kotlin android-studio kotlin-coroutines

7
推荐指数
1
解决办法
2330
查看次数

当您的所有协程已经用 CouroutineExceptionHandler 包装时,如何发现“作业被取消”异常的来源?

我阅读了所有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)

kotlin kotlin-coroutines

5
推荐指数
1
解决办法
2142
查看次数