Android: сохранение данных на протяжении всего жизненного цикла приложения - PullRequest
1 голос
/ 08 ноября 2019

Я работаю над приложением для Android, которое использует некоторые фоновые задачи (AsyncTasks), и я хочу использовать лучшие практики, касающиеся сохранения данных на протяжении жизненного цикла приложения и обратных вызовов задач.

До сих пор у меня есть смесьиз практики относительно этого:

1) У меня есть некоторые статические поля в классах, где AsyncTasks используются в виде:

private static String str1;
private static String str2;
private static int int1;
...//=>no more than 6 static fields

2) Я использую экземпляр приложения sinleton со многими получателями /сеттеры в виде:

package xxx.xxx.xxx

import xxx.xxx.xxx
...

public class AppSettings {

    private static AppSettings singleton;
    private String _field1;
    ...//=>many fields

    public void setField1(String field1) { _field1 = field1; }
    public String getField1() { return _field1; }
    ...//=>many getters/setters

    private AppSettings() {}

    public AppSettings getInstance(){
        if (instance== null) {
            synchronized(AppSettings.class) {
                if (instance == null)
                    instance = new AppSettings();
            }
        }
        return instance;
    }
}

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

Большое спасибо.

Edit 1: Просто чтобы уточнить.

Для того, чтобы вы более четко поняли, для чего я использую свой одноэлементный класс AppSettings, я приведу вам два примера:

1) Я использую i• хранить настройки приложения / значения конфигурации (поэтому имя), чтобы быть доступным в любом месте. Например, цвет шрифта, размер шрифта, что угодно.

2) Я использую его для хранения временных данных / значений. Например, мое основное действие создает небольшое видео в фоновом режиме с использованием класса VideoHelper и вызывается через AsyncTask, а поскольку процессу генерации видео требуются некоторые параметры из основного действия, я использую средства получения / установки AppSettings для их отправки.

Редактировать 2: Лучшее объяснение всего.

Благодаря @a_local_nobody я понял, что мой "случай использования" не так ясен, поэтому я добавлю еще несколько вещей.

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

Чтобы привести пример, я сохраняю цвет фона действий (и это только пример), так что если вВ будущем я передумал и решил использовать другой цвет фона, этот параметр (и многие другие) там централизован. Это похоже на «контейнер» для многих настроек приложения по умолчанию.

Что касается использования геттеров и сеттеров в этом одноэлементном классе приложения, я думаю, что я предложу @a_local_nobody предложение, связанное с определением некоторых статических переменных в каждом классе ииспользуйте их по мере необходимости, вместо того, чтобы иметь несколько несвязанных методов получения / установки по всему миру.

В любом случае, все комментарии приветствуются.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Ну, вы говорите о persisting data across app lifecycle, который, на мой взгляд, звучит так, как будто вы ищете ViewModel:

Класс ViewModel предназначен для хранения и управления пользовательским интерфейсом. связанные данные в сознательном жизненном цикле. Класс ViewModel позволяет данным переживать изменения конфигурации, такие как поворот экрана.

, а также:

Цель ViewModel - получить и сохранить информацию, которая являетсянеобходимо для Деятельности или Фрагмента. Действие или фрагмент должны иметь возможность наблюдать изменения в ViewModel.

ViewModels являются частью шаблона проектирования MVVM, с множеством примеров, доступных в Интернете.

Для получения дополнительной информации,Взгляните на документацию


в примечании, возможно, вы можете взглянуть на google sunflower project , чтобы найти некоторые идеи о том, какреализовать новые компоненты архитектуры, которые включают использование ViewModels.


Также стоит добавить, что то, что вы создали с помощью решения AppSettings, является большой зависимостью. Различные вещи будут зависеть от этого единственного объекта, и, скорее всего, он понадобится в вашем приложении. Вместо того, чтобы создавать его таким образом, вы можете рассмотреть возможность использования внедрения зависимостей с вашими опциями для android, вероятно, либо Dagger 2 , либо Koin для kotlin (если вы когда-нибудь переключитесь на kotlin) или, возможно, ваша собственная форма внедрения зависимостей без использования этих платформ.

Надеюсь, это поможет


Редактирование на основе отзывов от OP:

Я использую его для хранения параметров настройки / конфигурации приложения (именно поэтому название), которые будут доступны где угодно. Например, цвет шрифта, размер шрифта и т. Д.

это звучит как лучший вариант использования для общих настроек , особенно если это настройки, определенные пользователем, в противном случае вам следуетсохранить их в strings.xml и т. д. и использовать локализацию

Я использую его для хранения временных данных / значений. Например, мое основное занятие создает небольшое видео в фоновом режиме, используя класс VideoHelper и вызывается через AsyncTask, а поскольку процессу генерации видео требуются некоторые параметры из основного занятия, я использую методы получения / установки AppSettings для их отправки.

если у вас есть класс VideoHelper, вам может быть лучше либо создать шаблон проектирования Builder для этого объекта, либо иметь статические переменные для этого помощника, чтобы изменить его функциональные возможности по мере необходимости, если это переменныедля вашего VideoHelper, тогда они должны быть расположены вместе с вашим VideoHelper.

Вещи, которые меняются вместе, обычно должны оставаться вместе.

2 голосов
/ 08 ноября 2019

Ваш подход не может считаться «передовым опытом» в современной разработке для Android.

Рекомендуемый способ обработки изменений конфигурации - использование нового компонента архитектуры : ViewModel

У него есть свойство выживать при срабатывании onDestroy при изменении конфигурации.

enter image description here

В основном вам потребуетсяпереместить этот код AppSettings в ViewModel.

...