android - Android 的模型层如何使用 SharedPreferences 和 Context?

标签 android clean-architecture

我使用的是整洁的架构,模型层有一个存储库、一个改造接口(interface)和一个实现存储库并创建改造服务的类。我正在使用这个例子:https://github.com/saulmm/Avengers

这里是类: 改造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);
}

和其余数据源类:

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);
    }

我的问题是在最后一节课中,我在构造函数中使用了 SharedPrefences,但出现错误,因为我无法使用 android 上下文或 SharedPreferences 来获取保存的访问 token ,因为它是模型层。如何解决此问题,以便我可以在不使用任何 com.android 类的情况下使用模型层的访问 token ?

最佳答案

更好的方法是像这样动态地设置您的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
}

关于android - Android 的模型层如何使用 SharedPreferences 和 Context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41613657/

相关文章:

java - CardView 在运行时不显示高程

android - 使用 GUI -OR- adb 命令从模拟器中提取文件时出现问题

java - 我的 Java 项目的简洁架构实践

ios - Clean Architecture Swift 中在哪里触发加载

java - 在面向服务的体系结构中,映射器调用服务是一种好的做法吗?

android - Google Firebase 在 Android 应用中退出并忘记用户

android - 如何从来自android服务的视频网址获取缩略图?

android - javafx 移植的应用程序性能不佳

c# - 如何跨同一实体的实例实现实体验证

design-patterns - 整洁的架构 UseCases 与具有功能的 Controller