相关疑难解决方法(0)

使用 Retrofit + Kotlin Flow 处理错误的优雅方式

我最喜欢在 Android 上执行网络请求的方法(使用 Retrofit)。它看起来像这样:

// NetworkApi.kt

interface NetworkApi {
  @GET("users")
  suspend fun getUsers(): List<User>
}
Run Code Online (Sandbox Code Playgroud)

在我的 ViewModel 中:

// MyViewModel.kt

class MyViewModel(private val networkApi: NetworkApi): ViewModel() {
  val usersLiveData = flow {
    emit(networkApi.getUsers())
  }.asLiveData()
}
Run Code Online (Sandbox Code Playgroud)

最后,在我的活动/片段中:

//MyActivity.kt

class MyActivity: AppCompatActivity() {
  private viewModel: MyViewModel by viewModels()

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    viewModel.usersLiveData.observe(this) {
      // Update the UI here
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这种方式的原因是因为它本身就可以与 Kotlin flow 配合使用,非常易于使用,并且有很多有用的操作(flatMap 等)。

但是,我不确定如何使用此方法优雅地处理网络错误。我能想到的一种方法是用作Response<T>网络 API 的返回类型,如下所示:

// NetworkApi.kt

interface NetworkApi {
  @GET("users")
  suspend …
Run Code Online (Sandbox Code Playgroud)

android kotlin retrofit kotlin-coroutines kotlin-flow

15
推荐指数
2
解决办法
2万
查看次数

使用Retrofit和RX-java处理无网络的正确方法

我想在调用我的rx改装服务之前检查移动设备是否已连接到互联网.如果没有连接,我想返回一个包含错误的假响应.

我结束了下面的解决方案,使用defer(),但我认为它可以更好,任何提示?

private Observable<Response> checkNetwork(Observable<Response> retrofitService) {
        return Observable.defer(new Func0<Observable<Response>>() {
            @Override
            public Observable<Response> call() {
                if (!isOnline()) {
                    return Observable.just(Response.error(R.string.error_no_network_label)));
                }
                return retrofitService;
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

android rx-java retrofit

9
推荐指数
1
解决办法
7745
查看次数

自定义Retrofit ErrorHandler提供UndeclaredThrowableException

基于这篇文章我应如何处理Android上的Retrofit"无互联网连接"

我做了一个习惯 ErrorHandler

private static class CustomErrorHandler implements ErrorHandler {

    @Override
    public Throwable handleError(RetrofitError error) {
        if (error.isNetworkError()) {
            return new MyNetworkError();
        }

        return error.getCause();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我的应用程序崩溃了,我得到了这个:

java.lang.reflect.UndeclaredThrowableException
Run Code Online (Sandbox Code Playgroud)

适配器是否需要一些配置?使用Retrofit 1.6.0OkHttp 2.0.0

谢谢.

android retrofit

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

在 MVVM 中检查互联网连接的最佳位置在哪里?

我有一个apiClass进行所有网络调用的程序,我想我的选择是:

  1. activity在/内进行检查fragment

  2. apiClient在班级内进行检查

我确信有更好的选择。

编辑

这个答案提出了我的第二种选择。有更好的方法吗?

android mvvm

6
推荐指数
1
解决办法
5168
查看次数

如何在改造2.0.1中处理不同类型的异常和错误

我正在使用Retrofit 2.0.1.我想处理所有类型的网络错误和异常(如没有网络连接,超时错误,服务器未找到等)我找到了这个链接.但是在v1.8.0中已经弃用了一些方法.我怎么能在2.0.1中这样做?

rest android httpresponse retrofit2

5
推荐指数
2
解决办法
3626
查看次数

如何使用Dagger2提供上下文

我正在学习Android,并且正在遵循有关RxJava和Dagger2的Retrofit2的一些指南。现在,我不想处理没有互联网连接的情况。我已经找到了这个答案,这似乎很不错,但是我不知道如何应用。

我有一些NetworkModule,与OkHttpClient提供商。我假设我需要OkHttpClient.Builder使用拦截器进行创建。所以它应该看起来像这样:

@Provides
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
    ConnectivityInterceptor ci = new ConnectivityInterceptor(networkObservable()));
    OkHttpClient.Builder.addInterceptor(ci)
    return builder.build();
}

private boolean networkObservable() {
    ConnectivityManager cm =
            (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
Run Code Online (Sandbox Code Playgroud)

这是我所没有的Context。我应该朝哪个方向-尝试在那里获取上下文,或者可能我误解了可观察对象的概念?

android rx-java okhttp dagger-2 retrofit2

2
推荐指数
1
解决办法
3272
查看次数