Android MVP - поделиться настройками - PullRequest
0 голосов
/ 17 сентября 2018

Я начал изучать MVP, но у меня есть несколько вопросов, связанных с SharedPreferences. Насколько я знаю, если я хочу сохранить значение в sharedPreferences, мне нужно передать это значение докладчику, и докладчик вызывает модель для сохранения. значение, ту же логику, которую я применил бы, если бы я хотел получить или удалить значение из sharedPreference, но как лучше всего это сделать, если я не должен передавать Контекст?

Я сохранил немного кода, и люди передавали Контекст в методе конструктора непосредственно в Модель, но я все еще не думаю, что это хорошая идея.

У вас, ребята, есть идеи?

Спасибо, Фалес

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Создайте объект класса хранения внутри View и передайте контекст внутри конструктора класса хранения.

Затем передайте этот объект класса хранения в презентатор (конструктор) из класса View.

Затем, когда вам нужночтобы сохранить или получить некоторые данные от докладчика - просто вызовите метод класса хранения для объекта, который вы передали.

Таким образом, вам не нужно отправлять контекст докладчику.

Просмотр класса

public class ViewClass extends ActionBarActivity {

    private MyPresenter presenter;
    private MyStorage storage;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        storage = new MyStorage(this);
        presenter = new MyPresenter(this,storage);
    }

}

MyStorage Class

public class MyStorage {

    private Context mContext;

    public MyStorage(Context context) {
        this.mContext = context;
    }

    public void saveData(String data){

    }

    public String getData(){
        return "";
    }
}

MyPresenter class

public class MyPresenter {
    private final ViewClass mView;
    private final MyStorage mStorage;

    public MyPresenter(ViewClass viewClass, MyStorage storage) {
        this.mView = viewClass;
        this.mStorage = storage;
    }
}
0 голосов
/ 17 сентября 2018

Android-импорт никогда не должен существовать в Presenter, если вы хотите, чтобы он тестировался на модуле.

Что вы можете сделать, сделать слой абстракции выше SharedPreferences давайте назовем его Cache, это будетбудь интерфейсом со всеми необходимыми методами кеширования, вы бы обеспечили его конкретную реализацию, используя SharedPreferences.

Вот краткая иллюстрация идеи:

interface Cache {
// Your caching methods
}

class CacheImpl implements Cache {

    private SharedPreferences sharedPrefs;

    public CacheImpl(Context context) {
        // Takes a context to init sharedPrefs.
    }

    // implements all of Cache's methods
}

Тогда выпередаст ссылку для этой реализации в конструктор Presenter (еще лучше, используя DI для внедрения его в конструктор Presenters):

Cache cache = new CacheImpl(myContext); // Naturally that would be an activity context
MyPresenter presenter = new MyPresenter(cache);

Затем в презентаторе вы получите этот экземпляр в конструкторе:

private Cache cache;

public MyPresenter(Cache cache) {
    this.cache = cache;
}

Затем вы можете использовать переменную кэша, не зная о ее конкретной реализации, и при этом не следует предоставлять ей контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...