Java 我怎样才能接听安卓改装电话?

Java 我怎样才能接听安卓改装电话?,java,android,retrofit2,dry,Java,Android,Retrofit2,Dry,我的代码中有几个存储库类 例如,这是UserRepository: public class UserRepository { public static String TAG = "UserRepository"; ApiService mApiService; SharedPreferences mPrefs; Context mContext; RemoteDataSource<User> mRemoteDataSource; public UserReposito

我的代码中有几个存储库类

例如,这是UserRepository:

public class UserRepository {

public static String TAG = "UserRepository";

ApiService mApiService;

SharedPreferences mPrefs;
Context mContext;

RemoteDataSource<User> mRemoteDataSource;


public UserRepository() {
    mApiService = new RetrofitClient().getApiService();
    mContext = App.getAppContext();
    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    mRemoteDataSource = new RemoteDataSource<>();
}

public RemoteDataSource getRemoteDataSource() {
    mRemoteDataSource.setIsLoading();
    Call<ApiResponse> userCall = mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
    userCall.enqueue(new Callback<ApiResponse>() {
        @Override
        public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
            mRemoteDataSource.setIsLoaded();
            mRemoteDataSource.setData(response.body().getUser());
            mRemoteDataSource.setStatus(response.body().getStatus());
            mRemoteDataSource.setMessage(response.body().getMessage());
        }

        @Override
        public void onFailure(Call<ApiResponse> call, Throwable t) {
            Log.e(TAG, t.getMessage());
            mRemoteDataSource.setFailed(t.getMessage());
        }
    });

return mRemoteDataSource;
}

}
public class BonusRepository {

public static String TAG = "BonusRepository";

ApiService mApiService;

SharedPreferences mPrefs;
Context mContext;

LiveData<Bonus> mBonus;
String mId;
RemoteDataSource<Bonus> mRemoteDataSource;

public BonusRepository(String id) {
    mId = id;
    mApiService = new RetrofitClient().getApiService();
    mContext = App.getAppContext();
    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    mRemoteDataSource = new RemoteDataSource<>();
}

public RemoteDataSource getRemoteDataSource() {
    mRemoteDataSource.setIsLoading();
    Call<ApiResponse> bonusCall = mApiService.getBonus(mPrefs.getString(User.TOKEN_NAME, null), mId);
    bonusCall.enqueue(new Callback<ApiResponse>() {
        @Override
        public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
            mRemoteDataSource.setIsLoaded();
            mRemoteDataSource.setData(response.body().getBonus());
            mRemoteDataSource.setStatus(response.body().getStatus());
            mRemoteDataSource.setMessage(response.body().getMessage());
        }

        @Override
        public void onFailure(Call<ApiResponse> call, Throwable t) {
            Log.e(TAG, t.getMessage());
            mRemoteDataSource.setFailed(t.getMessage());
        }
    });
    return mRemoteDataSource;
}
}
mRemoteDataSource.setData(response.body().getUser())

不同于:

Call<ApiResponse> bonusCall = ApiService.getBonus(mPrefs.getString(User.TOKEN_NAME, null), mId);
调用bonusCall=ApiService.getBonus(mPrefs.getString(User.TOKEN\u NAME,null),mId);
mRemoteDataSource.setData(response.body().getBonus())在BonusRepository中

在其他存储库中,我有类似的重复代码

我想删除这些重复,但没有找到任何好的解决方案


干燥代码的最佳方法是什么?

创建所有存储库的抽象类父级,并实现getRemoteDataSource()方法,在每个特定实现中调用一个新的抽象方法,该方法将是唯一的特定方法

例如:

public class AbstractRepository {

protected abstract Call<ApiResponse> performCall();

public RemoteDataSource getRemoteDataSource() {
    mRemoteDataSource.setIsLoading();
    Call<ApiResponse> userCall = performCall();
    userCall.enqueue(new Callback<ApiResponse>() {
        @Override
        public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
            mRemoteDataSource.setIsLoaded();
            mRemoteDataSource.setData(response.body().getUser());
            mRemoteDataSource.setStatus(response.body().getStatus());
            mRemoteDataSource.setMessage(response.body().getMessage());
        }

        @Override
        public void onFailure(Call<ApiResponse> call, Throwable t) {
            Log.e(TAG, t.getMessage());
            mRemoteDataSource.setFailed(t.getMessage());
        }
    });

return mRemoteDataSource;
}

}
公共类抽象存储库{
受保护的抽象调用performCall();
公共RemoteDataSource getRemoteDataSource(){
mRemoteDataSource.setIsLoading();
Call userCall=performCall();
enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
mRemoteDataSource.setIsLoaded();
mRemoteDataSource.setData(response.body().getUser());
mRemoteDataSource.setStatus(response.body().getStatus());
mRemoteDataSource.setMessage(response.body().getMessage());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(标记,t.getMessage());
mRemoteDataSource.setFailed(t.getMessage());
}
});
返回mRemoteDataSource;
}
}
然后您可以执行以下操作:

public class UserRepository extends AbstractRepository {

public static String TAG = "UserRepository";

ApiService mApiService;

SharedPreferences mPrefs;
Context mContext;

RemoteDataSource<User> mRemoteDataSource;

public UserRepository() {
    mApiService = new RetrofitClient().getApiService();
    mContext = App.getAppContext();
    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    mRemoteDataSource = new RemoteDataSource<>();
}

protected Call<ApiResponse> performCall() {
    return mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
}
公共类UserRepository扩展了AbstractRepository{ 公共静态字符串TAG=“UserRepository”; ApiService和mApiService; 共享参考文献; 语境; 远程数据源mRemoteDataSource; 公共用户存储库(){ mApiService=new-client().getApiService(); mContext=App.getAppContext(); mPrefs=PreferenceManager.getDefaultSharedReferences(mContext); mRemoteDataSource=新的RemoteDataSource(); } 受保护的调用性能调用(){ 返回mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME,null)); }
}

我让你适应你的需要,但这是最好的解决方案

public class UserRepository extends AbstractRepository {

public static String TAG = "UserRepository";

ApiService mApiService;

SharedPreferences mPrefs;
Context mContext;

RemoteDataSource<User> mRemoteDataSource;

public UserRepository() {
    mApiService = new RetrofitClient().getApiService();
    mContext = App.getAppContext();
    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    mRemoteDataSource = new RemoteDataSource<>();
}

protected Call<ApiResponse> performCall() {
    return mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
}