用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。我希望这可以清除事情。

+0

你可以给它一个原始样本吗? –

+0

顺便说一句,你有一个错字在标题。你可能想改变它,以便有相同问题的人可以找到这个线程。 – JesperQv