从@jake Wharton的回答中,您应该只调用一次restAdapter.create,并在每次需要进行交互时重复使用相同的MyTaskService实例。 我不能强调这一点。 您可以使用常规单例模式,以确保在任何地方只使用这些对象的单个实例。依赖注入框架也可用于管理这些实例,但如果您尚未使用它,则会有点过分。
这是我的代码
public class MusicApi {
private static final String API_URL = "https://itunes.apple.com";
private static MusicApiInterface sMusicApiInterface;
public static MusicApiInterface getApi() {
if (sMusicApiInterface == null) {
sMusicApiInterface = null;
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)
.build();
sMusicApiInterface = restAdapter.create(MusicApiInterface.class);
}
return sMusicApiInterface;
}
public interface MusicApiInterface {
@GET("/search?entity=musicVideo")
NetworkResponse getMusic(@Query("term") String term);
@GET("/search?entity=musicVideo")
void getMusic(@Query("term") String term, Callback<NetworkResponse> networkResponseCallback);
@GET("/search?entity=musicVideo")
Observable<NetworkResponse> getMusicObservable(@Query("term") String term);
}
}
一切正常。我正在使用类型适配器,对于每个请求,我需要创建不同类型的gson解析并设置为适配器。
Gson gson = new GsonBuilder().registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson())
.create();
它让我每次都必须创建一个新的restadapter。在我的应用程序中,一些请求并行运行。这是正确的方法吗?
答案 0 :(得分:11)
您不必每次都创建它,但只需创建一次RestAdapter:
public static MusicApiInterface getApi() {
if (sMusicApiInterface == null) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson())
.create();
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)
.setConverter(new GsonConverter(gson))
.build();
sMusicApiInterface = restAdapter.create(MusicApiInterface.class);
}
return sMusicApiInterface;
}
如果您需要注册多个Deserializer
,请使用registerTypeAdapter
对和自定义Class/TypeToken
的实例多次致电。Deserializer
。根据您正在调用的改装方法的返回类型,Gson会调用正确的一个。 E.g
Gson gson = new GsonBuilder()
.registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson())
.registerTypeAdapter(OtherModelClass.class, new OtherModelClassDeserializerJson())
.registerTypeAdapter(OtherModelClass3.class, new OtherModelClass3DeserializerJson())
答案 1 :(得分:0)
这是Singletone RestAdapter和ApiInterface类的完整代码。如果我们使用RxAndroid,也可以使用RxJava2CallAdapterFactory。
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import kaj.service.customer.utility.ApplicationData;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by @ShihabMama 20/12/18 5.02 AM :)
*/
public class RestAdapter {
private static Retrofit retrofit = null;
private static ApiInterface apiInterface;
public static ApiInterface getRxClient() {
if (apiInterface == null) {
retrofit = new Retrofit.Builder()
.baseUrl(ApplicationData.FINAL_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
apiInterface = retrofit.create(ApiInterface.class);
}
return apiInterface;
}
public static ApiInterface getApiClient() {
if (apiInterface == null) {
retrofit = new Retrofit.Builder()
.baseUrl(ApplicationData.FINAL_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
apiInterface = retrofit.create(ApiInterface.class);
}
return apiInterface;
}
}
ApiInterface类
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created by @Shihab_Mama on 11/25/2016.
*/
public interface ApiInterface {
// TODO: 12/20/2018 sample below
@GET("orderapi/getOrders?")
Call<OrderListModel> getOrders(
@Query("accessToken") String accessToken,
@Query("companyId") String companyId,
@Query("customerId") int customerId);
@POST("orderapi/placeOrder")
Call<PlaceOrderResponseModel> placeOrder(
@Query("accessToken") String accessToken,
@Query("companyId") String companyId,
@Query("branchId") int branchId,
@Query("customerId") int customerId,
@Query("orderNo") String orderNo,
@Query("orderItemList") String orderItemList,
@Query("discountedTotalBill") String discountedTotalBill,
@Query("discountedTotalVat") String discountedTotalVat);
}