2016-05-19 3 views
0

Я реализую шаблон MVP, который использует шаблон репозитория для предоставления данных. Теперь у меня есть сомнения относительно наилучшего способа управления отношениями между действиями или фрагментами и данными. Моему приложению нужен набор объектов, который может быть большим, давайте предположим, что List. Эти объекты должны отображаться в фрагменте карты. Я знаю, что могу использовать объект Singleton или Application и хранить там данные. Другой выбор - просто загружать данные каждый раз, когда представление, которое требует загрузки этих данных. Наличие данных в Singleton легко и быстро, но в моем случае количество объектов может быть большим. Кроме того, есть проблемы с тестированием приложения, использующего Singletons. С другой стороны, загрузка данных каждый раз при загрузке представления может привести к проблемам с производительностью. Возможно, лучше всего было бы реализовать одно промежуточное решение, такое как кеширование данных?Сохраняет данные в памяти или загружается каждый раз при загрузке представления?

Будет здорово слушать ваши переживания. С уважением,

Редактировать: Я решил избежать использования Singleton с использованием кеша для хранения данных. Вот методы я использую для кэша:

/** 
* generic caching methods 
* @param key 
* @param object 
* @throws IOException 
*/ 
private static void writeObject(String key, Object object) throws IOException { 
    FileOutputStream fos = TheAAApp.getApp().openFileOutput(key, Context.MODE_PRIVATE); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(object); 
    oos.close(); 
    fos.close(); 
    saveCurrentTimeStamp(); 
} 

private static Object readObject(String key) throws IOException, 
     ClassNotFoundException { 
    FileInputStream fis = TheAAApp.getApp().openFileInput(key); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    Object object = ois.readObject(); 
    return object; 
} 

ответ

1

Мое предложение является то, что Presenter не должен иметь ни малейшего представления, где данные поступают из - он просто спрашивает Repository для него и решает, следует ли загрузить его из кеш в памяти или из db/network.

public class Repository { 

    private Cache cache; 
    private Network network; 

    public void getData(Callback<Data> callback) { 

     if (cache.hasData()) { 
      callback.next(cache.getData); 
     } 
     else { 
      getDataFromNetwork(callback); 
     } 
    } 

    private getDataFromNetwork(Callback<Data> callback) { 

     //etc 
     cache.putData(data); 
     callback.next(data); 
    } 
} 

Другое преимущество этого по сравнению с использованием Синглтон, где Android убил приложение из-за ограничений, пассивность/памяти. Если вы полностью полагаетесь на синглтон, тогда это может оказаться нулевым.

Вы также можете поэкспериментировать с различными вариантами кеширования без необходимости изменять какой-либо из ваших презентаций/представлений.

+0

Привет, Яхнольд, спасибо за ваш совет, на самом деле это то, что я сделал. Я решил, наконец, не использовать Singleton, заменив его кешем. Мое приложение большое, и мы увидим, можно ли полностью его избежать. Я редактирую свой вопрос, чтобы поместить эти методы, потому что, возможно, они могут быть полезны для других людей. – lm2a

 Смежные вопросы

  • Нет связанных вопросов^_^