Android MVP с залпом - PullRequest
       43

Android MVP с залпом

2 голосов
/ 07 октября 2019

У меня следующая проблема. Я хочу реализовать MVP с Android, используя Volley в качестве модели. Проблема в том, что для Volley requestQueue нужен контекст. Я знаю, что одним из решений является создание статического контекста, но это плохая практика. Как мне создать этот код с MVP.

RequestQueue queue = Volley.newRequestQueue(this);

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Думаю, я понял это. Я не могу гарантировать правильность ответа, но он работает.

Я изменил конструктор Presenter, и теперь я должен неявно передать правильное представление докладчику, поскольку при запуске приложения я передаю фрагмент, а неПосмотреть. Вот почему я создал метод setPresenter в интерфейсе MainView.

 public MainPresenter(MainContract.MainView view, NetworkLayer networkLayer) {
    this.view = view;
    this.view.setPresenter(this);
    this.networkLayer = networkLayer;
}

Теперь я устанавливаю NetworkLayer при запуске приложения (в MainActivity или в классе приложения). Там у меня есть доступ к контексту приложения, и я могу передать сетевой уровень без сохранения контекста в Presenter. Чтобы установить правильную связь между презентатором и моделью, я создал сеттер в NetworkLayer для передачи правильного презентатора.

    MainFragment mainFragment = new MainFragment();
    //Inject view and model
    MainContract.MainPresenter mainPresenter = new MainPresenter(mainFragment, NetworkLayer.getInstance(getApplicationContext()));
    NetworkLayer.getInstance(getApplicationContext()).setPresenter(mainPresenter);
0 голосов
/ 07 октября 2019

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

class NetworkRequest(
    private val context: Context
) {
    val queue = Volley.newRequestQueue(context)

    fun doNetworkRequest() {
        val request = StringRequest(...)
        queue.add(request)
    }
}

class Presenter(
    private val networkRequest: NetworkRequest
) {
    . . .
}

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

...