gpt4 book ai didi

android - 重用 Retrofit 方法

转载 作者:搜寻专家 更新时间:2023-11-01 08:28:31 25 4
gpt4 key购买 nike

我有一个方法可以使用 Retrofit 调用我的服务器:

public class MainActivity extends AppCompatActivity {

// ... activity methods here, removed for simplicity ...

// Used to subscribe to a user given their userId
public void subscribeToUser(int userId) {
final ApiInterface apiService = ApiClient.createService(ApiInterface.class);

Call<BasicResponse> call = apiService.subscribe(userId);
call.enqueue(new Callback<BasicResponse>() {
@Override
public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) {
if (response.isSuccessful()) {
Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_LONG).show();
}
}

@Override
public void onFailure(Call<BasicResponse> call, Throwable t) {
Log.e(TAG, t.toString());
}
});
}

}

我现在需要在另一个 Activity 中使用相同的方法 (subscribeToUser()),但是将该方法复制并粘贴到另一个 Activity 中没有任何意义。然后我只会有两次相同的代码。

那么我是否可以将方法放在一个地方,让 Activity 知道调用是成功还是失败?我应该如何组织这个?

这是我的 ApiClient.java 类:

public class ApiClient {

public static final String API_BASE_URL = "http://www.website.com/api/";

private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());

public static <S> S createService(Class<S> serviceClass) {
Retrofit retrofit = builder.client(httpClient.build()).build();

return retrofit.create(serviceClass);
}

public static <S> S createService(Class<S> serviceClass, final String authToken) {
if (authToken != null) {
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();

// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.header("Authorization", "Bearer " + authToken)
.method(original.method(), original.body());

Request request = requestBuilder.build();
return chain.proceed(request);
}
});
}

OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();

return retrofit.create(serviceClass);
}
}

这是我的 ApiInterface.java 类:

public interface ApiInterface {
@FormUrlEncoded
@POST("subscribe")
Call<BasicResponse> subscribe(@Field("userId") Integer userId);
}

谢谢。

最佳答案

在我看来,createService(ApiInterface.class) 不应被多次调用。这不是必需的,并且会减慢您的应用程序。您可以尝试使用单例模式创建 UserService,如下所示:

public class UserService {

private UserService userService;
final ApiInterface apiService;
//Contructor private to prevent init object from outside directly.
private UserService() {
apiService = ApiClient.createService(ApiInterface.class);
}
//use this method when you need to use UserService
public static UserService getInstance() {
if(userService == null) {
userService = new UserService();
}
}

// Used to subscribe to a user given their userId
public void subscribeToUser(int userId, ServiceCallBack serviceCallBack) {
final ApiInterface apiService = ApiClient.createService(ApiInterface.class);

Call<BasicResponse> call = apiService.subscribe(userId);
call.enqueue(new Callback<BasicResponse>() {
@Override
public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) {
if (response.isSuccessful()) {
Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_LONG).show();
serviceCallBack.successful(response);
} else {
Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_LONG).show();
}
}

@Override
public void onFailure(Call<BasicResponse> call, Throwable t) {
Log.e(TAG, t.toString());
serviceCallBack.fail(t);
}
});
}
//this is callback interface, help you know whether success from outside.
interface ServiceCallBack {
void successful(Response response);
void fail(Throwable t);
}
}

使用方法:

 UserService.getInstance(1, new ServiceCallBack(){

@Override
public void successful(Response response) {
//process successful
}

@Override
public void fail(Throwable t) {
//process fail
}
});

现在您可以将所有与 User api 相关的方法放到 UserService 类中以供重用。

关于android - 重用 Retrofit 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42639066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com