当前位置: 首页 > 知识库问答 >
问题:

RxJava和使用Kotlin进行改造

苏宾鸿
2023-03-14

如何使用RxJava和Kotlin中的改型创建api调用的泛型类?

我的JAVA实现是::

首先添加Gradle依赖项:(更新到最新版本(如果可用))

//用于改装

实现“com.squareup.reverfit2:reverfit:2.3.0”

实现“com.squareup.reverfit2:converter-gson:2.3.0”

//对于拦截器实现“com.squareup.okhttp3:logging-interceptor:3.9.0”

buildTypes{debug{buildConfigField“string”,“server_url”,“dev_url”“debuggable true”}release{buildConfigField“string”,“server_url”,“live_url”“minifyEnabled false}}

//如果设置了environment,则使用set environment定义

字符串BASE_URL=buildconfig.server_url+“url”;

=============================================================================================================================================

public class RestClient {

private static RestClient instance;
private ApiConstant apiInterface;
private OkHttpClient.Builder okHttpClientBuilder;

public RestClient() {
    instance = this;
    okHttpClientBuilder = new OkHttpClient.Builder();
    okHttpClientBuilder.connectTimeout(60, TimeUnit.SECONDS);
    okHttpClientBuilder.writeTimeout(60, TimeUnit.SECONDS);
    okHttpClientBuilder.readTimeout(60, TimeUnit.SECONDS);


//for logs of api response in debug mode

    if (BuildConfig.DEBUG) {
        final HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        okHttpClientBuilder.addInterceptor(interceptor);
    }
}

public static RestClient getInstance() {
    return instance;
}

public ApiConstant getApiInterface() {

    final Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
    retrofitBuilder.baseUrl(ApiConstant.BASE_URL);
    retrofitBuilder.client(okHttpClientBuilder.build());
    retrofitBuilder.addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = retrofitBuilder.build();
    apiInterface = retrofit.create(ApiConstant.class);

    return apiInterface;
}

}

=========================================================================================
ApiInterface:(用于api调用的接口)

public interface ApiInterface {

@POST("Urls Params")
Call<ModelClass> postValidateToken(@Body JSONObject body);

}

=================================================================================
创建名为RetrofitCallback的泛型类,该类处理Api响应并抛出基本错误,并向用户显示Toast消息

public abstract class RetrofitCallback<T> implements Callback<T> {

private ProgressDialog progressDialog;
private Context context;
private boolean validateResponse = true;

public RetrofitCallback(Context c) {
    context = c;
}

public RetrofitCallback(Context c, ProgressDialog dialog) {
    progressDialog = dialog;
    context = c;
}

    public RetrofitCallback(Context context, ProgressDialog progressDialog, boolean validateResponse) {
    this.progressDialog = progressDialog;
    this.context = context;
    this.validateResponse = validateResponse;
}

public RetrofitCallback(Context context, boolean validateResponse) {
    this.context = context;
    this.validateResponse = validateResponse;
}

public abstract void onSuccess(T arg0);

@Override
public void onResponse(Call<T> call, Response<T> response) {

    if (!(((Activity) context).isFinishing()) && progressDialog != null && progressDialog.isShowing()) {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

    if (response.isSuccessful() && response.code() == 200) {
        onSuccess(response.body());
    } else {
        Toast.makeText(context, context.getString(R.string.something_wrong), Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onFailure(Call<T> call, Throwable error) {
    if (!validateResponse)
        return;

    String errorMsg;
    error.printStackTrace();
    if (error instanceof SocketTimeoutException) {
        errorMsg = context.getString(R.string.connection_timeout);
    } else if (error instanceof UnknownHostException) {
        errorMsg = context.getString(R.string.nointernet);
    } else if (error instanceof ConnectException) {
        errorMsg = context.getString(R.string.server_not_responding);
    } else if (error instanceof JSONException || error instanceof JsonSyntaxException) {
        errorMsg = context.getString(R.string.parse_error);
    } else if (error instanceof IOException) {
        errorMsg = error.getMessage();
    } else {
        errorMsg = context.getString(R.string.something_wrong);
    }

    if (progressDialog != null && progressDialog.isShowing()) {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }
    Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show();
}
}

============================================================================================================
字符串:(String.xml)

出了点问题。请稍后再试。没有可用的internet连接。请稍后再试。服务器没有响应。请稍后再试。连接超时无法分析来自服务器的响应

=================================================================================
实现(如何调用活动或片段):

 Call<User> userLoginCall = RestClient.getInstance().getApiInterface().LoginURL(Util.currentLanguage,
                Util.getLoginURL(getActivity(), email, LOGIN_GOOGLE, accID));
        userLoginCall.enqueue(new RetrofitCallback<User>(getActivity(), DialogUtils.showProgressDialog(getActivity())) {
            @Override
            public void onSuccess(User user) {

                //Your Response
            }
        });

共有1个答案

左恺
2023-03-14

我使用一个ServiceGenerator类,以备需要使用多个改型服务接口时使用。

object ServiceGenerator {

    const val APP_CODE = "APP_CODE"

    private val interceptor = HttpLoggingInterceptor()
        .setLevel(HttpLoggingInterceptor.Level.BODY)

    private val certificatePinner = CertificatePinner.Builder()
        .add(BuildConfig.HOSTNAME, BuildConfig.SHA1_HASH1)
        .add(BuildConfig.HOSTNAME, BuildConfig.SHA1_HASH2)
        .add(BuildConfig.HOSTNAME, BuildConfig.SHA1_HASH3)
        .add(BuildConfig.HOSTNAME, BuildConfig.SHA1_HASH4)
        .build()

    private val httpClient = OkHttpClient.Builder()
        .readTimeout(1, TimeUnit.MINUTES)
        .connectTimeout(1, TimeUnit.MINUTES)
        .addInterceptor(interceptor)

    private val builder = Retrofit.Builder()
        .baseUrl(BuildConfig.URL_ENDPOINT)
        .addCallAdapterFactory(
                    RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io())
        )
        .addConverterFactory(GsonConverterFactory.create())

    private var requestInterceptor: AppEventosRequestInterceptor? = null

    fun <S> createService(context: Context, serviceClass: Class<S>): S {
        if (BuildConfig.FLAVOR.equals("production")) {
            httpClient.certificatePinner(certificatePinner)
        }
        if (!httpClient.interceptors().contains(requestInterceptor)) {
            requestInterceptor = AppEventosRequestInterceptor(context)
            httpClient.addInterceptor(requestInterceptor!!)
        }
        builder.client(httpClient.build())
        val retrofit = builder.build()
        return retrofit.create(serviceClass)
    }
}

在我的例子中,我使我的服务能够返回一个可流动的响应,这样我就可以观察它了。

@GET("schedule")
fun getSchedules(
        @Header("If-None-Match") etag: String
): Flowable<Response<ResponseBody>>

然后,当我要进行http调用时,我首先初始化我的ServiceRx类

private var mService: AppEventosServiceRx = ServiceGenerator.createService<AppEventosServiceRx>(applicationContext, AppEventosServiceRx::class.java)
mService.getSchedules(mEtagManager.getEtag(EtagManager.ETAG_SCHEDULES))
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
        { response ->
            if (response.code() != HttpURLConnection.HTTP_NOT_MODIFIED) {
                if (response.body() != null) {
                    // Do your useful stuff here...
                }
            } else {
                // Check if not modified or any other HTTP Error
            }
        },
        { throwable -> 
            // Log your connectivity problems ...
        }
    ) {}

希望有帮助!

 类似资料:
  • 首先,如果我对Rxjava的理解有错,请告诉我。 既然我们已经使用API查询使用referfit过滤了数据,那么对已经获得的数据进行操作有什么需要 为什么在RXJava中使用客户接口对象?因此,我们将其用于观察者或onNext()的位置。 Rxjava是否也有助于检索目的,或者它只是对已经获得的数据进行操作?

  • 在网络请求中使用和有什么好处。我见过许多使用的示例,但我想明白为什么。 示例情形: 为每个工作单元创建一个新线程。将使用线程池 但这种争论对应用程序有什么影响呢?还有哪些方面?

  • 我试图使用RxJava和Rome的改型,在你建议使用组件拱之前(在这个机会是不可能的,项目是在和50%和只需要继续与拱清理)。 所以问题是这个。我有一个返回POJO的web服务。类似于这样: null 相互作用者 回调 演示文稿 演示者 查看

  • 我想从JSON中获取一些数据,但gson给出了错误。我想知道如何解决这个问题? 我使用的是dagger2(这部分100%正常工作)和rxJava(这部分总是调用onError方法)。 我的型号: 我的JSON: 我的回应: 我的改装: 我的服务: 错误: com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(tr

  • 本文向大家介绍Android Kotlin和RxJava示例,包括了Android Kotlin和RxJava示例的使用技巧和注意事项,需要的朋友参考一下 示例 第一个示例在Kotlin中重新实现,并使用RxJava进行更清晰的交互。 用法很简单。使用RxJava工具可以在单独的线程上进行订阅。            

  • 现在,我使用subject来捕获。subscribe()上的错误,如下所示 在一些电话中 然后,在我的主要活动中,我订阅该行为主题并解析错误