Я пишу приложение для Android, и хотя я уже читал о MVP и видел несколько примеров в Android, я сомневаюсь, как мне структурировать эту часть приложения.
ПРИМЕЧАНИЕ. Мое приложение имеет структуру, очень похожую на: https://github.com/googlesamples/android-architecture/tree/todo-mvp.
В этом приложении Модель должна получать данные JSON из веб-службы. Эти данные, среди прочего, содержат ссылки на изображения, которые приложение должно загружать асинхронно. И после загрузки эти изображения должны быть представлены пользователю.
Как мне подойти к этому?
Прямо сейчас моя идея состоит в том, чтобы добавить логику запроса веб-службы в модель (я также использую шаблон репозитория) и логику загрузки в презентаторе. Примерно так (код - всего лишь пример):
class MyPresenter {
....
void init() {
myRepositoryInstance.fetchDataAndSaveLocally(new MyCallback() {
@Override
public void success(List<Thing> listOfThings) {
// do some other stuff with listOfThings data
...
List<URL> imagesURL = getImagesURLs(listOfThings);
// config/use Android DownloadManager to download the images
...
registerReceiver(onImageDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
@Override
public void error() {// logging stuff, try again...}
});
}
void onImageDownloadComplete() {
URL path = getWhereTheImageWasSaved();
Thing thing = getInstanceOfThingAssociatedWithThisImage();
myRepositoryInstance.updatePathOfThingImage(thing, path);
viewInstance.updateTheViewPager(); // I'll probably show these images on a ViewPager
}
....
}
В этом есть смысл? Логика загрузки принадлежит Presenter? Не слишком ли много логики я придаю Presenter?
ПРИМЕЧАНИЕ. Я подумываю поместить логику загрузки в Presenter, потому что DownloadManager нужен контекст (кстати, Glide тоже нужен). В качестве альтернативы я знаю, что могу использовать AsyncTask для модели для загрузки с помощью HttpURLConnection, но как мне сообщить результат загрузки обратно в Presenter? В последнем я должен использовать события?
ПРИМЕЧАНИЕ 2. Мне бы очень хотелось, если бы я мог провести модульное тестирование этой части приложения (Mocking the DownloadManager). Таким образом, передача контекста в модель не является вариантом, поскольку она нарушает MVP (IMHO) и будет намного сложнее ее модульное тестирование.
Любая информированная помощь будет оценена!
Обновления
Спасибо за ответ @ amadeu-cavalcante-filho. Позвольте мне рассмотреть каждую проблему. Во-первых, проблема контекста: мне нужен контекст, если я использую Glade (библиотеку загрузки изображений) или DownloadManager для загрузки изображений, поэтому, если я загружаю изображения в модели (репозиторий), мне придется передать их в Смоделируйте экземпляр Context, и это явно нарушит MVP.
Во-вторых, MVVM, я мало что знаю о MVVM, но мне кажется, что модель в MVP должна знать, как получать данные (https://medium.com/@cervonefrancesco/model-view-presenter-android-Guidelines-94970b430ddf) с использованием шаблона репозитория или чего-то еще как это.
В-третьих, я склонен согласиться с тем, что Presenter действительно может загружать изображения (это именно тот пример, который я построил в своем вопросе). Но моя проблема в следующем: должен ли Presenter знать о материалах Android (в данном случае о контексте)? Это огромная часть моего вопроса, где Android должен быть в MVP? Единственное место, где можно узнать об Android, - это представление, но логика загрузки явно не принадлежит ему.