使用Dagger 2和RxJava2包装SharedPreferences

时间:2017-09-25 08:53:00

标签: android sharedpreferences dagger-2 rx-java2

我是否需要包装Android SharedPreferences课程?如果是的话,能否请您提供一个简单的工作示例?

我知道如何使用SharedPreferences,但是当涉及到包装并提供Dagger 2和RxJava2时,我很困惑。

1 个答案:

答案 0 :(得分:13)

我通常只使用名为LocalStorage的接口或类似的东西来包装它。然后在实现中注入Context并像往常一样实现SharedPreferences。如果您想使用Rx,请确保您的接口方法返回Observables

然后,只要您需要使用SharedPeferences,只需注入LocalStorage,即可全部设置。

编辑:我不知道你需要多少代码,但这里是一个样本。

首先定义一个接口

public interface LocalStorage {
    void writeMessage(String message);
    Observable<String> readMessage();
}

然后使用SharedPreferences编写此接口的实现。那么我们需要做些什么呢?好吧,我们真正需要的只是一个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(或者你决定称之为的任何东西)。我们已经知道我们需要一个上下文来使SharedPrefStorage工作,所以把它作为一个参数,dagger会注入它(前提是你有一个带有上下文的@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并将它注入到我们想要的任何地方。

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    LocalStorage localStorage();
}

现在我们可以在需要的时候注入LocalStorage。我希望这可以解决问题。