- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是否需要包装 Android SharedPreferences
类?如果是,能否请您提供一个简单的工作示例?
我知道如何使用 SharedPreferences
,但是当涉及到包装它并为它提供 Dagger 2 和 RxJava2 时,我感到很困惑。
最佳答案
我通常只是使用一个名为 LocalStorage
或类似的接口(interface)来包装它。然后将 Context
注入(inject)到实现中,并像往常一样实现您的 SharedPreferences。如果您想使用 Rx,只需确保您的接口(interface)方法返回 Observables
。
然后,每当您需要使用 SharedPeferences 时,只需注入(inject)一个 LocalStorage
,一切就绪。
编辑:我不确定您需要多少代码,但这里有一个示例。
从定义接口(interface)开始
public interface LocalStorage {
void writeMessage(String message);
Observable<String> readMessage();
}
然后使用SharedPreferences编写这个接口(interface)的实现。那么我们需要什么才能让它发挥作用呢?好吧,我们真正需要的只是一个 Context
,但我们不用担心,当我们在 dagger 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 工作,所以把它作为一个参数,dagger 会注入(inject)它(前提是你有一个带有上下文的 @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);
}
}
然后,当然,让我们将它添加到我们的 Dagger 2 组件中,以便我们真正公开 LocalStorage 并可以将它注入(inject)到我们想要的任何地方。
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
LocalStorage localStorage();
}
现在我们可以在需要时注入(inject)我们的 LocalStorage。我希望这能解决问题。
关于android - 用 Dagger 2 和 RxJava2 包装 SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46401184/
Dagger 和 Dagger 2.0 有什么区别,为什么 Google 决定 fork 现有项目? 最佳答案 来自 Dagger 2 presentation 的一些引述 Dagger 1 的问题:
我想制作一个包含一个主要 Activity 和多个 fragment 的简单项目。在这里,我在一项 Activity 中有两个 fragment ,我想将演示者注入(inject)登录 fragmen
我是 dagger 的新手,我正在寻找如何在 dagger-2.x 中实现 spring 配置文件等功能。我想为我的开发环境和生产环境使用不同的 bean,但我使用的是带有 Java 的 Dagger
假设我有两个服务 AService 和 BService,它们都需要一个 API key 。 所以在我的模块中,我不能做类似的事情: @Provides @Singleton @A @ApiKey S
我对 Dagger 很陌生——我什至不知道它是否适用于我的应用程序 我有一个搜索页面,它返回有关给定名人的最新消息。 我写了一个测试来验证当我们搜索一个受欢迎的名人时结果会出现在页面上。 page有一
我最近将 dagger 2.8 更新为 2.9 dagger。和最新版本的文档已添加如下: -添加@BindsInstance组件构建器可以轻松绑定(bind)在图之外构建的实例。 -制作人:已添加
Dagger documentation页面说: To get the most out of compile-time validation, create a module that includ
我可以知道之间的区别吗? @Singleton VS 静态 在dagger2中提供? @Provides static User currentUser(AuthManager authManager
我有一个功能,我需要为不同的用户提供不同的房间数据库。 我正在使用 Dagger 2 创建房间数据库。我的应用程序组件创建一个房间数据库。当用户切换到另一个用户时,我想为此创建新的房间数据库,我需要创
我是 Dagger 2 的新手,正在尝试 IntelliJ 中的 Dagger 2 Coffee Example,它似乎不会生成 DaggerCoffeeApp_Coffee(它应该生成它),即使我密
我正在尝试在 Android 上使用 Dagger 2。我以前让它工作,我有一个 appModule 将依赖项注入(inject)应用程序中的特定类。我的问题是我收到错误 Error:(14, 55)
我是 kotlin 和 Dagger 的新手。我有一个小问题,我不知道如何解决,也没有找到解决方案。 这就是我所拥有的: @Module class AppModule (app: Applicati
我正在尝试使用 Dagger 建立一个项目。现在,当我构建时,没有为组件生成任何 Dagger* 类,并且出现以下错误: Error:(10, 8) error: [com.redditapp.dag
在 Dagger 中,我有时会看到有些组件只扩展一个接口(interface),而其他组件则使用 dependencies。 例如我们有一个基础组件: @Singleton @Component(mo
有没有办法告诉 Dagger 2 如何提供一些东西,但不允许它被注入(inject)? 假设我要注入(inject)一个 Qux .一个 Qux需要 Foo和 Bar : @Provides @Sin
( x-post from /r/androiddev ) 我只想在序言中说这不是一篇“哪个更好”的帖子;这严格来说是一个关于如何使用 Dagger 构建某些东西的问题(以及如何在 Kodein 中构
https://developer.android.com/topic/libraries/architecture/ 在Android架构蓝图中,为什么dagger是基于mvp架构而不是MVVM架构
我第一次开始同时使用 Kotlin 和 Dagger 2。我假设一切都与 Java 中的相同,但显然不完全相同。 Dagger 不会为我生成 Dagger* 文件。这是我的代码: 组件: @PerAc
我正在尝试将 Dagger 2 与 eclipse 集成,我使用的库如下: dagger-2.0.jar dagger-compiler-2.0.jar guava-13.0.1.jar javawr
我想练习这个Dagger 2 Vehicle Motor例子。 除了我的 gradel.build 之外,我所做的一切都与该教程中的一样: compile 'com.google.dagger:dag
我是一名优秀的程序员,十分优秀!