Использование класса приложений Android для сохранения данных

StackOverflow https://stackoverflow.com/questions/4208886

  •  25-09-2019
  •  | 
  •  

Вопрос

Я работаю над довольно сложным приложением Android, которое требует несколько большого количества данных о приложении (я бы сказал, что в общей сложности около 500 КБ - это большая для мобильного устройства?). Из того, что я могу сказать, любая изменение ориентации в приложении (в деятельности, как точнее) вызывает полное разрушение и отдых деятельности. Исходя из моих выводов, класс приложений не имеет такого же жизненного цикла (т. Е. Это, для всех намерений и целей, всегда созданных). Соответствует ли смысл хранить информацию о состоянии внутри класса приложений, а затем ссылаться на его из активности или в том, что вообще не является «приемлемым» методом из-за ограничений памяти на мобильных устройствах? Я действительно ценю любые советы по этой теме. Спасибо!

Это было полезно?

Решение

Я не думаю, что 500кб будет такой большой сделки.

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

Вы можете передавать данные в глобальном синглтоне, если он будет много использовать.

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

Затем назовите это в любой деятельности:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

Я обсуждаю это здесь, в моем блоге, в разделе «Глобальный синглтон».

Другие советы

Те, кто рассчитывает на Application Экземпляр неверны. Сначала это может показаться, как будто Application Существует до тех пор, пока весь процесс приложения существует, но это неверное предположение.

ОС может убивать процессы по мере необходимости. Все процессы разделены на 5 уровней «убийства» указано в док.

Так, например, если ваше приложение идет на заднем плане из-за пользователей, отвечающего на входящий вызов, то в зависимости от состояния оперативной памяти ОС может (или не может) убить ваш процесс (уничтожение Application экземпляр в процессе).

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

ОБНОВИТЬ:

Я получил много отрицательных отзывов, поэтому пришло время добавить разъяснения. :) Хорошо, изначально я действительно использовал неправильное предположение, что государство действительно важно для приложения. Однако, если ваше приложение в порядке, что иногда состояние потеряно (это могут быть некоторые изображения, которые будут просто перечитаны / выгруженными), то он полностью хорошо, чтобы сохранить его в качестве члена Application.

Если вы хотите получить доступ к «Global Singleton» вне деятельности, и вы не хотите проходить Context Посредством всех связанных объектов для получения Singleton вы можете просто определить статический атрибут в вашем классе приложений, который содержит ссылку на себя. Просто инициализировать атрибут в onCreate() метод.

Например:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

Потому что подклассы Application Также можно получить ресурсы, вы можете получить доступ к ним просто при определении статического метода, который возвращает их, как:

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

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

Дейв, какие данные это? Если общие данные, которые относятся к приложению в целом (пример: пользовательские данные), то продлите класс приложений и храните его там. Если данные относятся к действию, вам следует использовать обработчики OnsaveInStanceState и OnreStoreInstanceState, чтобы сохранить данные о вращении экрана.

Вы можете на самом деле переопределить функциональность ориентации, чтобы убедиться, что ваша деятельность не разрушена и воссоздана. Смотреть здесь.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top