用Dagger 2和RxJava2包装SharedPreferences
问题描述:
我是否需要包装Android SharedPreferences
类?如果是的话,你能否给我一个简单的工作例子?用Dagger 2和RxJava2包装SharedPreferences
我知道如何使用SharedPreferences
,但是当涉及到包装它并为它提供Dagger 2和RxJava2时,我很困惑。
答
我通常只是使用名为LocalStorage
或类似的接口来包装它。然后像往常一样将Context
注入实现并实现SharedPreferences。如果您想使用Rx,只需确保您的界面方法返回Observables
。
然后,无论何时您需要使用SharedPeferences,只需注入一个LocalStorage
即可完成设置。
编辑:我不知道你需要多少代码,但这里是一个示例。
通过定义的接口
public interface LocalStorage {
void writeMessage(String message);
Observable<String> readMessage();
}
然后写使用SharedPreferences这个接口的实现开始。那么我们需要做什么?那么,我们真正需要的是Context
,但我们不用担心,我们将在匕首2模块中创建LoginStorage
时通过构造函数传递一个。
public class SharedPrefStorage implements LocalStorage {
private Context context;
public SharedPrefStorage(Context context) {
this.context = context;
}
@Override
public void writeMessage(String message) {
context.getSharedPreferences("sharedprefs", Context.MODE_PRIVATE)
.edit().putString("myMessage", message).apply();
}
@Override
public Observable<String> readMessage() {
return Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return context.getSharedPreferences("sharedprefs", Context.MODE_PRIVATE)
.getString("myMessage", "");
}
}
}
}
正如你所看到的,我们只是像往常一样读写值,没有什么奇特的。现在我们只需将它添加到我们的Dagger 2 AppModule中(或者你决定调用它的任何东西)。我们已经知道,我们需要一个Context来让SharedPrefStorage起作用,所以把它作为一个参数,匕首将会注入它(假设你有一个带有上下文的@Provides方法,例如你的应用程序类)。
@Module
public class AppModule {
private MyApplication app;
public AppModule(MyApplication app) {
this.app = app;
}
@Provides
@Singleton
public MyApplication provideApp() {
return app;
}
@Provides
@Singleton
public LocalStorage provideLocalStorage(MyApplication context)
return new SharedPrefStorage(context);
}
}
然后,当然,让我们将它添加到我们的匕首2组件,这样我们实际上暴露localStorage的,可以把它注射的地方,我们希望它。
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
LocalStorage localStorage();
}
现在我们只需要在需要的时候注入LocalStorage。我希望这可以清除事情。
你可以给它一个原始样本吗? –
顺便说一句,你有一个错字在标题。你可能想改变它,以便有相同问题的人可以找到这个线程。 – JesperQv