Android 改造设计模式
Android Retrofit Design Patterns
我正在使用 Retrofit 与我的 REST 交互 API,想知道是否有人有任何设计建议。
我的应用有以下软件包:
- 型号
- 服务
- 活动
- 碎片
services 包包含 Retrofit 的接口。例如:
public interface FooService {
@FormUrlEncoded
@POST("foo/do")
@Headers("Content-Type: application/x-www-form-urlencoded; charset=UTF-8")
Call<FooBar> do();
}
模型包含...嗯,不同的模型。例如,FooBar。到目前为止一切顺利 - 正如 Retrofit 文档所述。
我创建了一个 API class,它处理 Retrofit 构建逻辑(Retrofit retrofit = new Retrofit.Builder()
等),并公开一个静态字段:retrofit.In 然后我的活动可以执行我的请求如下:
FooService service = API.retrofit.create(FooService.class);
Call<FooBar> call = service.do();
try {
retrofit2.Response response = call.execute();
// ...do stuff...
} catch(IOException) {}
随之而来的是我的问题:进一步抽象上述内容会更好吗?这样我就不需要到处重复上面的内容了?例如,类似于:
MyOtherFooService service = new MyOtherFooService();
FooBar fooBar = service.do();
有什么想法吗?推荐?
我通常使用具有以下结构的单例模式:
首先像下面这样定义 ServiceHelper
:
public class ServiceHelper {
private static final String ENDPOINT = "http://test.com";
private static OkHttpClient httpClient = new OkHttpClient();
private static ServiceHelper instance = new ServiceHelper();
private IPlusService service;
private ServiceHelper() {
Retrofit retrofit = createAdapter().build();
service = retrofit.create(IPlusService.class);
}
public static ServiceHelper getInstance() {
return instance;
}
private Retrofit.Builder createAdapter() {
httpClient.setReadTimeout(60, TimeUnit.SECONDS);
httpClient.setConnectTimeout(60, TimeUnit.SECONDS);
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.interceptors().add(interceptor);
return new Retrofit.Builder()
.baseUrl(ENDPOINT)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create());
}
public Call<List<CategoryModel>> getAllCategory() {
return service.getAllCategory();
}
然后将您所有的服务放入 IService
(在我的例子中是 IPlusService
)
public interface IPlusService {
//@Headers( "Content-Type: application/json" ) in Post method may use this
@GET("/api/category")
Call<List<CategoryModel>> getAllCategory();
}
然后在 activity/fragment 中像下面这样调用你的 单身人士 :
ServiceHelper.getInstance().getAllCategory().enqueue(new Callback<List<CategoryModel>>() {
@Override
public void onResponse(Response<List<CategoryModel>> response, Retrofit retrofit) {
processResponse(response);
}
@Override
public void onFailure(Throwable t) {
processResponse(null);
}
});
我会说不要这样做。特别是因为大多数调用需要使用异步 .enqueue 并以不同方式处理错误响应。
您可以创建自己的抽象 Retrofit Callback class 并从中抽象出 'custom' 回调,这样您就可以避免代码重复。
但通常我希望看到应用程序逻辑在我发出请求的同一位置处理响应。
不要陷入过度思考的陷阱,或者应用一些并不真正适合 Android 的滥用模式。
如果您真的需要从 activity/fragment 传递响应,只需使用 RxJava 甚至 LocalBroadcast。也尝试阅读 Retrofit 这本书。
我正在使用 Retrofit 与我的 REST 交互 API,想知道是否有人有任何设计建议。
我的应用有以下软件包:
- 型号
- 服务
- 活动
- 碎片
services 包包含 Retrofit 的接口。例如:
public interface FooService {
@FormUrlEncoded
@POST("foo/do")
@Headers("Content-Type: application/x-www-form-urlencoded; charset=UTF-8")
Call<FooBar> do();
}
模型包含...嗯,不同的模型。例如,FooBar。到目前为止一切顺利 - 正如 Retrofit 文档所述。
我创建了一个 API class,它处理 Retrofit 构建逻辑(Retrofit retrofit = new Retrofit.Builder()
等),并公开一个静态字段:retrofit.In 然后我的活动可以执行我的请求如下:
FooService service = API.retrofit.create(FooService.class);
Call<FooBar> call = service.do();
try {
retrofit2.Response response = call.execute();
// ...do stuff...
} catch(IOException) {}
随之而来的是我的问题:进一步抽象上述内容会更好吗?这样我就不需要到处重复上面的内容了?例如,类似于:
MyOtherFooService service = new MyOtherFooService();
FooBar fooBar = service.do();
有什么想法吗?推荐?
我通常使用具有以下结构的单例模式:
首先像下面这样定义 ServiceHelper
:
public class ServiceHelper {
private static final String ENDPOINT = "http://test.com";
private static OkHttpClient httpClient = new OkHttpClient();
private static ServiceHelper instance = new ServiceHelper();
private IPlusService service;
private ServiceHelper() {
Retrofit retrofit = createAdapter().build();
service = retrofit.create(IPlusService.class);
}
public static ServiceHelper getInstance() {
return instance;
}
private Retrofit.Builder createAdapter() {
httpClient.setReadTimeout(60, TimeUnit.SECONDS);
httpClient.setConnectTimeout(60, TimeUnit.SECONDS);
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.interceptors().add(interceptor);
return new Retrofit.Builder()
.baseUrl(ENDPOINT)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create());
}
public Call<List<CategoryModel>> getAllCategory() {
return service.getAllCategory();
}
然后将您所有的服务放入 IService
(在我的例子中是 IPlusService
)
public interface IPlusService {
//@Headers( "Content-Type: application/json" ) in Post method may use this
@GET("/api/category")
Call<List<CategoryModel>> getAllCategory();
}
然后在 activity/fragment 中像下面这样调用你的 单身人士 :
ServiceHelper.getInstance().getAllCategory().enqueue(new Callback<List<CategoryModel>>() {
@Override
public void onResponse(Response<List<CategoryModel>> response, Retrofit retrofit) {
processResponse(response);
}
@Override
public void onFailure(Throwable t) {
processResponse(null);
}
});
我会说不要这样做。特别是因为大多数调用需要使用异步 .enqueue 并以不同方式处理错误响应。
您可以创建自己的抽象 Retrofit Callback class 并从中抽象出 'custom' 回调,这样您就可以避免代码重复。
但通常我希望看到应用程序逻辑在我发出请求的同一位置处理响应。
不要陷入过度思考的陷阱,或者应用一些并不真正适合 Android 的滥用模式。
如果您真的需要从 activity/fragment 传递响应,只需使用 RxJava 甚至 LocalBroadcast。也尝试阅读 Retrofit 这本书。