Android 如何在模型层使用 SharedPreferences 和 Context?
How do I use SharedPreferences and Context in the model layer in Android?
我正在使用干净的架构,模型层有一个存储库、一个改造接口和一个 class 实现存储库并创建改造服务。我正在使用这个例子:https://github.com/saulmm/Avengers
以下是 class:
改造 api 服务
public interface ApiService {
@GET("api/events")
Observable<List<Event>> getEvents();
@GET("api/event/{id}")
Observable<Event> getEvent(@Path("id") int id);
@Multipart()
@POST("api/events")
Observable<Event> postEvent(@Part("venue") Venue venue,
@Part RequestBody image,
@PartMap Map<String, RequestBody> params
);
}
存储库
public interface WyatRepository {
Observable<List<Event>> getEvents();
Observable<Event> getEvent(int id);
Observable<Event> postEvent(Venue venue, String path, Map map);
}
其余数据源class:
public class RestDataSource implements WyatRepository {
public final static String ENDPOINT = "http://xxxxxxxx.com/";
private final ApiService apiService;
public RestDataSource() {
OkHttpClient client = new OkHttpClient();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
client.interceptors().add(loggingInterceptor);
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original =chain.request();
Request request = original.newBuilder().header("Authorization",new SharedPreferencesUtil(getBaseContext()).getToken)
.method(original.method(),original.body())
.build();
return null;
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ENDPOINT)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
apiService = retrofit.create(ApiService.class);
}
@Override
public Observable<Album> getAlbum(int id) {
return apiService.getAlbum(id);
}
@Override
public Observable<List<Event>> getEvents() {
return apiService.getEvents();
}
@Override
public Observable<Event> getEvent(int id) {
return apiService.getEvent(id);
}
我的问题是在最后一个 class 中,在构造函数中我使用了 SharedPrefences 但我得到了一个错误,因为我无法使用 android 上下文或 SharedPreferences 来获取访问令牌保存下来,因为是模型层。我该如何解决这个问题,以便我可以在不使用任何 com.android classes 的情况下使用模型层的访问令牌?
您可以在 RestDataSource
的构造函数中传递 activity 或片段的上下文
public RestDataSource(Context context) {
Request request = original.newBuilder().header("Authorization",new SharedPreferencesUtil(context).getToken)
.method(original.method(),original.body())
.build();
}
如果您从 activity 调用此 class,您可以使用
RestDataSource rest=new RestDataSource(this);
或者如果您使用的是片段
RestDataSource rest=new RestDataSource(getActivity());
更好的方法是像这样动态地设置您的 Authorization
:
@GET("api/event/{id}")
Observable<Event> getEvent(@Header("Authorization") String authHeader,
@Path("id") int id);
或者在您的方法中您可以传递上下文:
public RestDataSource(Context context) {
// now you can access your shared preferences
}
我正在使用干净的架构,模型层有一个存储库、一个改造接口和一个 class 实现存储库并创建改造服务。我正在使用这个例子:https://github.com/saulmm/Avengers
以下是 class: 改造 api 服务
public interface ApiService {
@GET("api/events")
Observable<List<Event>> getEvents();
@GET("api/event/{id}")
Observable<Event> getEvent(@Path("id") int id);
@Multipart()
@POST("api/events")
Observable<Event> postEvent(@Part("venue") Venue venue,
@Part RequestBody image,
@PartMap Map<String, RequestBody> params
);
}
存储库
public interface WyatRepository {
Observable<List<Event>> getEvents();
Observable<Event> getEvent(int id);
Observable<Event> postEvent(Venue venue, String path, Map map);
}
其余数据源class:
public class RestDataSource implements WyatRepository {
public final static String ENDPOINT = "http://xxxxxxxx.com/";
private final ApiService apiService;
public RestDataSource() {
OkHttpClient client = new OkHttpClient();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
client.interceptors().add(loggingInterceptor);
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original =chain.request();
Request request = original.newBuilder().header("Authorization",new SharedPreferencesUtil(getBaseContext()).getToken)
.method(original.method(),original.body())
.build();
return null;
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ENDPOINT)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
apiService = retrofit.create(ApiService.class);
}
@Override
public Observable<Album> getAlbum(int id) {
return apiService.getAlbum(id);
}
@Override
public Observable<List<Event>> getEvents() {
return apiService.getEvents();
}
@Override
public Observable<Event> getEvent(int id) {
return apiService.getEvent(id);
}
我的问题是在最后一个 class 中,在构造函数中我使用了 SharedPrefences 但我得到了一个错误,因为我无法使用 android 上下文或 SharedPreferences 来获取访问令牌保存下来,因为是模型层。我该如何解决这个问题,以便我可以在不使用任何 com.android classes 的情况下使用模型层的访问令牌?
您可以在 RestDataSource
的构造函数中传递 activity 或片段的上下文 public RestDataSource(Context context) {
Request request = original.newBuilder().header("Authorization",new SharedPreferencesUtil(context).getToken)
.method(original.method(),original.body())
.build();
}
如果您从 activity 调用此 class,您可以使用
RestDataSource rest=new RestDataSource(this);
或者如果您使用的是片段
RestDataSource rest=new RestDataSource(getActivity());
更好的方法是像这样动态地设置您的 Authorization
:
@GET("api/event/{id}")
Observable<Event> getEvent(@Header("Authorization") String authHeader,
@Path("id") int id);
或者在您的方法中您可以传递上下文:
public RestDataSource(Context context) {
// now you can access your shared preferences
}