【问题标题】:Reusing Retrofit method重用改造方法
【发布时间】:2017-07-27 02:47:24
【问题描述】:

我有一个使用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());
            }
        });
    }

}

我现在需要在另一个活动中使用相同的方法 (subscribeToUser()),但是将方法复制并粘贴到另一个活动中没有意义。那样我就会有两次相同的代码。

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

这是我的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);
}

谢谢。

【问题讨论】:

  • 你尝试使用BaseActivity extend AppCompatActivity包含方法subscribeToUser,然后MainActivity和其他活动扩展BaseActivity。
  • @RoShanShan 如果出现我需要在活动之外使用subscribeToUser() 方法的情况,比如在适配器中怎么办?
  • 我认为您可以在 Activity 中使用该方法并将结果发送到您的适配器。或者您可以将context 发送到您的适配器并使用 ((YouActivity)context).subscribeToUser()。

标签: android android-activity retrofit retrofit2


【解决方案1】:

在我看来,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 类中进行重用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2017-04-01
    • 2020-07-04
    相关资源
    最近更新 更多