如何在 android 中通过改造处理 206 代码?

how to handle 206 code with retrofit in android?

我是改装新手,我想处理代码 206。

所以基本上我调用我的休息 api 并得到一个 Observable 但我不知道如何处理结果以及如何在需要时再次调用 api。

例如:

Observable<CompanyListRest> vAllCompanyList = api.findAllCompanys1WithParams(vParamsMap);

会调用我的api(参数是起始索引和要获取的元素数) 但如何对重复动作进行编码。

我尝试使用 onNext 添加订阅者,但它不起作用

抱歉,如果不清楚, 谢谢

更新和解决方案:

我关注 Azim Salimov 的 znswer

Observable<Response<CompanyListRest>> vAllCompanyListResponse = api.findAllCompanys1WithParams();
        vAllCompanyListResponse.subscribe(new  Observer<Response<CompanyListRest>>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
            }

            @Override
            public void onNext(@NonNull Response <CompanyListRest> pCompanyListRest) {
                if(pCompanyListRest.code() == 206){
                    vAllCompanyList.addAll(pCompanyListRest.body().getCompany());
                    
                    // change parameters of search
    
                    vAllCompanyListResponse.retry().subscribe(this::onNext);
                } else if( pCompanyListRest.code() == 200){
                    return;
                }

            }

这很好用!

嗯,你的问题不是很清楚,但如果你想重复一个动作,你可以使用“接口”。 例如这是我的 ApiInterface

public interface ApiInterface {

@POST("register.php")
Call<User> regCall(@Query("name") String Name, @Query("username") String UserName, @Query("email") String email, @Query("password") String Password);

@GET("login.php")
Call<User> loginCall(@Query("username") String UserName,@Query("email") String email, @Query("password") String Password);
}

这是我的ApIclass

public class API {


private static final String BASE_URL = "http://192.168.1.6/uni/";
public static Retrofit myRetrofit = null;

public static Retrofit getAPI() {

    if (myRetrofit == null) {

        myRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

    }

    return myRetrofit;

}

当我想在 activity

中使用它时
apiInterface = API.getAPI().create(ApiInterface.class);

Call<User> logCall = MainActivity.apiInterface.loginCall(logUser, logEmail, logPassword);

    logCall.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {

            if (Objects.requireNonNull(response.body()).getApiResposnse().equals("SUCCESS")) {
                Toast.makeText(getActivity(), "You login successfully!", Toast.LENGTH_SHORT).show();
                prefManager.setLogin(true);
                prefManager.createLoginSession(logUser,logEmail);
                Intent i = new Intent(getActivity(), firstPage.class);
                startActivity(i);
                Objects.requireNonNull(getActivity()).finish();
                

            } else if (response.body().getApiResposnse().equals("FAILED")) {
                Toast.makeText(getActivity(), "LoginFragment failed!", Toast.LENGTH_SHORT).show();
                Toast.makeText(getActivity(), "Username or Password incorrect. please try again", Toast.LENGTH_SHORT).show();
            }

        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {

            String loginError = "Connection Error!";
            Toast.makeText(getContext(), loginError + t, Toast.LENGTH_SHORT).show();

        }
    });

您可以将 CompanyListRest 响应包装在 Response 内,如下所示:

Observable<Response<CompanyListRest>>

Response 来自 retrofit2:

import retrofit2.Response;

现在您可以在 onNext 方法中检查 206 的响应代码:

@Override 
public void onNext(Resposne<CompanyListRest> response) {
   int statusCode = response.code();
   if(statusCode == 206){
      //do something...
   }
}

要再次调用此函数,只需再次调用此函数即可)。 我建议您拥有一个可以控制所有请求的存储库。