Как правильно кэшировать данные android приложение
Зачастую при разработке приложения не уделяется достаточно внимания логике работы с данными. В результате любые изменения в архитектуре становятся настоящей проблемой. В этой статье я хочу дать несколько советов по организации работы с данными — их получению, хранению и кэшированию — которые позволят упростить разработку и дальнейшую поддержку программы.
Эта тема будет интересна разработчикам любых мобильных приложений, особенно тех, чье основное предназначение — загрузка и отображение данных, а также отправка данных на сервер. Примерами могут быть любые приложения, через которые пользователь получает доступ к какой-либо информации: новостные приложения, мобильные версии журналов, приложения для путешественников и многие другие.
С точки зрения архитектуры приложения загрузка данных с сервера не должна быть связана с отображением данных или с логикой хранения данных в локальном хранилище. Каждый компонент должен отвечать лишь за свою часть работы и предоставлять другим компонентам методы для работы с ним. Для увеличения скорости разработки и повышения качества приложения стоит придерживаться классической трехуровневой структуры приложения:
К этому уровню обычно относят работу с базой данных. Но сюда также можно отнести и взаимодействие с сервером, т.к. в большинстве случаев он является таким же хранилищем данных, доступ к которому осуществляется по Интернету.
На этом уровне формируется набор данных для отображения. Здесь отправляются необходимые запросы к серверу или локальному хранилищу, происходит группировка данных и др.
Этот уровень отвечает за вывод имеющихся данных пользователю и получение данных от пользователя. К этому уровню относится работа с компонентами Activities, Fragments, Adapters, Views и т.д.
Рассмотрим некоторые компоненты приложения с такой трехуровневой структурой.
Предметная область
Для работы с данными нам потребуются специальные классы — JavaBeans. С их помощью можно передавать информацию между различными компонентами приложения. Эти классы предназначены лишь для хранения информации и не должны содержать логики работы с ней.
Общение с сервером
Все взаимодействие с сервером должно происходить только внутри одного компонента. Здесь будут находиться методы, с помощью которых мы будем получать данные с сервера или загружать данные на сервер. На выходе методов будут лишь объекты предметной области или примитивы, такие как String, int, boolean и др.
Локальное хранение данных
Существует несколько способов хранения данных в Android-приложении:
- с помощью класса SharedPreferences
- в базе данных SQLite
- во внутренней памяти устройства (на диске)
Для хранения с помощью класса SharedPreferences больше подходят единичные данные, такие как профиль пользователя. Также в SharedPreferences можно хранить и списки примитивов, например, список id-объектов через запятую. Несмотря на то, что обращения к SharedPrefereneces являются операциями «ввода-вывода» (I/O), которые потенциально могут выполняться очень долго, на практике их вполне можно вызывать в UI-потоке.
Встроенная база данных SQLite хорошо подходит для хранения списков объектов. Правда, предлагаемые методы работы с ней в Android достаточно неудобны, поэтому для хранения сложных объектов лучше воспользоваться дополнительной библиотекой ORMlite.
Так же как и при работе с сервером, логика работы с локально хранимыми данными должна быть спрятана внутри соответствующего компонента. Единственное, что должны знать остальные части приложения — это то, какие методы надо вызвать для получения необходимых данных (объектов предметной области) или для совершения какой-либо операции с ними.
Кэширование данных
Мобильные устройства не всегда имеют стабильное подключение к Интернету, поэтому часто возникает потребность в кэшировании данных. Большим минусом приложения будет, если без Интернета пользователь останется и без нужной информации. Кроме того, кэширование применяется чтобы ускорить работу приложения. Например, если одни и те же данные выводятся на разных экранах или часто используются для формирования контента экрана. Типичный пример — кэширование изображений, загруженных с сервера.
Работа с изображениями часто является одним из самым узких мест в приложении, которой стоит уделить особое внимание. Ведь хорошая организация загрузки и кэширования изображений позволяет добиваться хорошей скорости работы приложения в целом. Однако эта задача является достаточно сложной. Чтобы решить ее, воспользуйтесь сторонними библиотеками или обратитесь за помощью к опытным разработчикам.
Работа с данными
В большинстве случаев получение данных из источника — с сервера, локальной базы данных или внутренней памяти устройства — является достаточно длительной операцией. Чтобы не блокировать пользовательский интерфейс, мы осуществляем эту операцию в отдельном потоке. Кроме того, при получении данных могут возникнуть различные ошибки — ошибки чтения с диска, ошибки подключения к Интернету или ошибки, пришедшие в ответе сервера. Нужно создать централизованное место, которое бы обрабатывало ошибки и выводило их на экран пользователям.
Для решения данных проблем хорошо подходит абстрактный класс-наследник AsyncTask. Внутри него будет происходить обработка ошибок:
Далее для каждой операции с данными создается свой класс, наследник ErrorHandlingTask. В нем достаточно определить метод doBackgroundTask, ошибки в котором будут обработаны родительским классом.
AsyncTask чаще всего используется, когда данные требуются для отображения на конкретном экране. Если же операция с данными не привязана к конкретному экрану, то имеет смысл вынести ее выполнение в отдельный сервис. Для этого хорошо подходит встроенный класс IntentService. Он помогает выполнять различные операции в сервисе в отдельном потоке.
Если результат операции, происходящей в сервисе, должен отображаться в пользовательском интерфейсе (например, прогресс загрузки файла на сервер), то лучше всего воспользоваться таким полезным инструментом, как broadcast. Он позволяет подписаться на определенные события, происходящие в другой части приложения, и реагировать на них соответствующим образом.
Также broadcast подходит для обработки некоторых видов ошибок сервера. Например, если при запросе к серверу приходит ошибка «User is not logged in», то необходимо закрыть все открытые экраны и предложить пользователю ввести свои учетные данные. В данном случае мы можем послать специальный broadcast, получив который, все активные экраны приложения самостоятельно закроются.
В данной статье я хотел подчеркнуть, что при создании приложений следует:
- уделять достаточное внимание общей архитектуре;
- стараться выделять отдельные компоненты приложения;
- заключать логику работы приложения внутри соответствующих компонентов;
- выставлять наружу лишь необходимые для связи между компонентами методы.
Как показывает опыт, такой подход упрощает разработку приложения, особенно внесение в него изменений на поздних стадиях, а также облегчает дальнейшую поддержку приложения.
Подпишитесь
Оставьте адрес, и каждый месяц мы будем высылать свежую статью
о новых трендах в разработке програмного обеспечения.
Что ж, эти данные, безусловно, важны, и знание того, когда их хранить или удалять, поможет вам эффективно использовать свой телефон Android. В этом посте я расскажу вам все, что вам нужно знать о данных и кэше приложения и о том, как правильно ими управлять.
Что такое кэш приложений?
Давайте начнем с кэша приложения, так как это менее радикальный вариант. Приложения, которые зависят от стабильного интернет-соединения, обычно загружают данные для правильной работы. Данные могут включать в себя картинки, видео, аудиофайлы, шрифты, документы, сценарии и другие данные, которые заставляют приложение работать. Эти данные сохраняются в кэш-памяти, поэтому их можно использовать повторно при повторном доступе к этому приложению.
Благодаря кешу вам не нужно загружать данные каждый раз, и вам не придется ждать, пока они будут загружены. Вы экономите на интернет-данных, и приложение также будет загружать контент быстро (или мгновенно).
Проще говоря, все пассивные данные, которые загружают ваши телефонные приложения, сохраняются в кэше для повторного использования. Это одна из причин, почему приложения, которые не зависят от интернет-данных, не кэшируют данные.
Почему вы не должны очищать кеш приложения?
Кэш приложения может занимать сотни мегабайт на вашем телефоне, поэтому может показаться заманчивым удалить кэшированные данные, чтобы освободить место. Однако, как я уже говорил выше, этот кэш используется для ускорения работы приложения и устранения необходимости загружать и обновлять данные каждый раз, когда вы получаете доступ к приложению.
Если вы очистите кэш, приложение будет казаться немного вялым, когда вы запустите его, и некоторые данные могут открыться через секунду или две при повторной загрузке. Снижение производительности и данных, которые будут загружены полностью, зависит от того, насколько сильно приложение зависело от кэшированного ресурса. Некоторые приложения зависят меньше, некоторые зависят больше.
С другой стороны, если вы играете в игру, которая зависит от кэшированных данных для правильной работы (Monster Legends является хорошим примером), то вы увидите значительное снижение производительности после удаления кэша.
Весь интерфейс и вновь разблокированный контент будут загружены снова, поэтому для правильной игры в игру необходимо будет загрузить сотни МБ данных.
У многих людей есть привычка удалять кэш каждый день, или они используют приложение повышения производительности, которое автоматически удаляет весь кэш через определенное время. Частое удаление кэша определенно повлияет на производительность приложений на вашем телефоне.
Когда вы должны очистить кэш приложения?
- Если в вашем телефоне меньше места и вам нужно добавить больше данных, вы можете просто удалить кэш, чтобы получить возврат. Кэш снова будет накапливаться, но, по крайней мере, вы сможете добавить больше данных за это время.
- Иногда слишком большой кэш может также замедлить работу телефона, занимая слишком много места или заставляя телефон обрабатывать больше данных, чем необходимо при использовании приложения. Удаление кэша может помочь ускорить ваш телефон. Однако, попробуйте это, только если у вас слишком много кэша (по крайней мере, в ГБ), и ваш телефон работает медленно.
- Некоторые приложения могут также не работать должным образом из-за поврежденного или устаревшего кэша. Если приложение работает, как замедление, сбой или просто не работает, удалите его кэш и попробуйте снова.
Что такое данные приложения?
Когда вы начинаете использовать приложение, вы входите в него, настраиваете его параметры, загружаете дополнительный контент или функции и делаете другие вещи, чтобы персонализировать приложение. Все эти данные являются данными приложения. Проще говоря, все, что вы вручную настраиваете в приложении или запрашиваете приложение для загрузки, относится к данным приложения.
Обычно данные приложения имеют размер лишь несколько МБ, содержащих основную информацию, но они могут стать очень большими, если приложение зависит от загрузки данных. Хорошим примером такого приложения будет YouTube. Функция просмотра видео в автономном режиме на YouTube позволяет загружать видео из памяти телефона для просмотра без интернета.
Эти видео сохраняются в виде данных приложения для YouTube и могут занимать гигабайты, если вы загружаете много видео. Точно так же видеоигры имеют больше данных приложения из-за объема информации, которую они сохраняют.
Почему вы не должны очистить данные приложения?
Теперь, когда вы знаете, что такое данные приложения, я уверен, что вы не осмелитесь прикоснуться к ним. Удаление данных приложения приведет к удалению всех данных внутри приложения или игры, включая информацию о вашей прикрепленной учетной записи, конфигурации, ваш прогресс в игре и любые другие данные, от которых вы напрямую зависите.
Если данные приложения не были скопированы в облаке ни вами, ни создателями приложения; тогда все ваши данные будут потеряны навсегда. Проще говоря, кнопка «Очистить данные приложения» - это кнопка сброса настроек для приложений, которая возвращает приложение в состояние, в котором оно было при первоначальной установке.
Когда вы должны очистить данные приложения?
Разница между данными приложения и кешем
Короче говоря, данные приложения - это важные данные, которые могут помешать удалению приложения, а кеш - это полезные данные, которые удобно иметь, но которые можно удалить, не потеряв ничего важного.
Удаление кэша приведет к удалению только тех данных, которые используются для повышения производительности приложения. С другой стороны, удаление данных приложения приведет к удалению всех данных внутри приложения, включая кэш.
Как удалить данные приложения и кеш?
Теперь, когда вы знаете, когда удалять данные приложения и кэш, а когда нет, давайте посмотрим, как вы можете на самом деле удалить эти данные, используя несколько методов:
Удалить кеш и данные отдельных приложений
Если вы хотите очистить данные приложения или кэш для конкретного приложения, вы можете сделать это из его настроек. Перейдите в настройки своего телефона и нажмите «Приложения». Здесь вы увидите все ваши приложения в списке. Просто найдите нужное приложение и нажмите на него, чтобы открыть его настройки. Вы должны увидеть оба варианта очистки кеша и данных приложения.
Нажмите на «Кэш», чтобы очистить весь кэш, или нажмите «Очистить данные приложения», а затем подтвердите запрос на очистку данных.
Вы можете заметить, что для очистки кэша не требуется никакого подтверждения, а для очистки данных приложения требуется второе подтверждение. Это ясно показывает, что кэш не слишком сильно влияет на приложение, но данные приложения очень важны и требуют надлежащего разрешения для удаления.
Удалить весь кеш
Вы также можете удалить кэш всех приложений одним нажатием. Это хороший вариант, когда вы хотите освободить место и не хотите заходить на страницу настроек каждого приложения. Зайдите в настройки вашего телефона и нажмите на хранилище. Здесь вы увидите опцию Clear Cache. Нажмите на нее и подтвердите запрос, чтобы очистить кэш приложений.
очистить кэш
Используйте стороннее приложение для очистки кеша
Обычно я не рекомендую использовать стороннее приложение для очистки кэша, но если вам нужен больший контроль, это может быть хорошим вариантом. Clean Cache - хорошее бесплатное приложение для этой цели, которое предлагает хороший контроль. Это позволит вам видеть кэш всех приложений в одном месте, и вы можете легко удалить кэш отдельных приложений одним касанием.
Очистить кэш упростит очистку кеша отдельных приложений, но не используйте его для ежедневной очистки всего кеша. Я уже говорил вам о важности кэша.
Завершение
Есть очень редкие ситуации, когда вам может понадобиться удалить данные приложения, но вам, возможно, придется часто удалять кэш для разных целей. В конце концов, обе эти данные неплохие для вашего телефона Android. Хотя вы должны знать, когда их удобно удалять, чтобы эффективно использовать телефон.
Любому, кто когда-либо сталкивался с проблемой, касающейся приложения или программного обеспечения на Android, можно дать совет очистить кэш приложения или очистить данные приложения.
Эти два решения часто считаются чудодейственными средствами для Android, но в чем разница между этими, казалось бы, подобными операциями? Позвольте нам объяснить, что это такое, и как и когда их использовать.
Что означает очистка кэша приложения?
Кэш – это область временного хранения информации на устройстве, которая сохраняет определенные типы данных. Она способна ускорить быстроту и плавность работы девайса, плюс, сокращает количество обрабатываемых и используемых данных.
После перезагрузки телефона вы когда-нибудь замечали, как медленно открывается приложение для камеры, в то время как каждая последующая попытка выполняется быстрее? Увеличение скорости после первого запуска приложения происходит именно благодаря этим кэшированным данным. Аналогичным образом, вы можете обнаружить, что сайты загружаются быстрее во время второго и последующего их посещения. Снова скажем, что это потому, что файлы, такие как изображения, ранее были сохранены в кэше.
Часто нет необходимости вручную управлять кэшированными данными: Android способна сама выполнять этим процессом. Однако если приложение начинает плохо себя вести или перестает работать, вы можете вручную осуществить нужные действия.
Схема «Настройки>Память>Данные кэша» дает решение в одно касание для удаления данных кэша.
Когда вы очищаете кэшированные данные приложения, вы удаляете временные файлы, размещенные там, и вы будете удивлены, как часто этот простой шаг дает положительные результаты. Однако вы должны также знать о том, что такие действия не гарантирует более высокую производительность, и приложение может быть временно работать медленнее при следующем использовании.
Что означает очистка данных приложения?
Очистка данных приложения является более серьезным шагом. Хотя кэш можно очистить с небольшим риском для настроек приложения, пользовательских настроек и сохраненных состояний, очистка данных приложения полностью удалит их.
Очистка данных сбрасывает приложение в состояние по умолчанию: оно делает ваше приложение таким же, как при первой загрузке и установке. Например, скажем, вы вносите изменения в настройки вашего любимого приложения для фитнеса. Вы изменяете продолжительность упражнений и настройки звука. Очистка кэша не повлияет на эти сохраненные настройки. Очистка сохраненных данных может и, по всей вероятности, полностью удалит их.
Очистка данных приложения – простой процесс, однако он удалит все ваши настройки и настройки в приложении.
Когда следует выполнять такие очистки?
Есть несколько обстоятельств, при которых вы можете очистить данные приложения или кэша.
- Во-первых, чтобы сэкономить память. Некоторые приложения могут хранить гигабайты данных, которые вам больше не нужны (приложения для подкастов часто виноваты в этом). В этом случае вы можете очистить ваши данные;
- другая, и более распространенная причина – сбросить приложение до состояния по умолчанию, если с ним связана та или иная проблема.
Как очистить данные приложения или кэша?
Мы рекомендуем время от времени проводить профилактические очистки кэша, причем очищайте кэш приложений с наибольшим размером данных. Для этого:
- перейдите в меню настроек;
- нажмите на «Приложения»;
- найдите вкладку «Все» (если ваша система не показывает все приложения по умолчанию);
- выберите приложение, имеющее большой размер;
- нажмите на иконку «Очистка кэша». Если вы используете версию Android 6.0 Marshmallow или новее на вашем устройстве, тогда вам нужно нажать на «Память», а затем кликнуть по иконке «Очистка кэша»;
- чтобы очистить данные приложения вместо кэша, просто выберите пункт «Очистка данных».
Однако такая схема работает только для очистки одного приложения. Чтобы очистить кэш каждого приложения одновременно, выполните следующие действия:
- перейдите в настройки;
- в разделе «Память» найдите «Данные кэша» или «Сохраненные данные» и выполните нажатие;
- на экране появится запрос на подтверждение удаления всего, что хранится в кэшах. Подтвердите и сохраните, чтобы удалить содержимое.
Пару слов о приложениях для «повышения производительности»
Есть много приложений, которые утверждают, что «повышают производительность устройства», но часто это неверно. Во многих случаях эти приложения просто предоставляют клавишу с одним касанием для завершения процессов и очистки кэша, которые в значительной степени не нужны на сегодняшней платформе Android. В принципе, вы можете и должны делать это вручную, если это требуется, но не допускайте, чтобы это вошло у вас в привычку.
Кэш, как мы уже говорили выше, это область хранения, в которой данные или часто используемые процессы сохраняются для более быстрого доступа в будущем. В конечном счете, кэш фактически экономит время и позволяет избежать ненужного использования аппаратного обеспечения на вашем телефоне.
Таким образом, очистка вашего приложения, когда ваш телефон работает медленно или память заполнена, может показаться лучшим вариантом в краткосрочной перспективе, но это может иметь последствия в долгосрочной перспективе, поэтому вы не должны делать это слишком часто.
Послесловие
Не существует «лучшего» или «худшего» варианта, когда дело доходит до очистки кэша и очистки данных приложения. Оба процесса имеют свое назначение.
Ваш первый шаг к исправлению проблемного приложения должен будет заключаться в очистке кэша, поскольку это наименее навязчивый метод быстрого исправления приложений. Если это не удается, или если вы хотите освободить больший объем пространства для хранения, очистите данные. Просто помните, что все, что хранится или сохраняется в приложении, включая аудио, видео или файлы изображений, также будет удалено.
Механизм кэширования Android - общая реализация хранилища
Кэш Android разделен на кеш памяти и файловый кеш (дисковый кеш). В первые дни, до того, как стали популярными основные фреймворки кэширования изображений, наиболее часто используемыми методами кэширования памяти были SoftReference и WeakReference.Например, большинство методов использования: HashMap <String url, SoftReference <Drawable>> imageCache; форма. Начиная с Android 2.3 (уровень 9), сборщик мусора более склонен к повторному использованию объектов SoftReference или WeakReference, что делает SoftReference и WeakReference менее практичными и эффективными. В то же время после Android 3.0 (уровень 11) Bitmap данных изображения помещается в область кучи памяти, а память в области кучи управляется сборщиком мусора, и разработчику не нужно освобождать ресурсы изображения, но это также делает Выпуск данных изображения непредсказуем, что увеличивает вероятность OOM. Поэтому после Android 3.1 в Android появился класс кэша памяти LruCache, и на объекты в LruCache имеются сильные ссылки.
Так называемый кеш второго уровня на самом деле не сложен.Когда стороне Android требуется получить данные, например получить изображения из сети, мы сначала ищем в памяти (поиск по ключу), а затем ищем файл на диске или sqlite, если в памяти ничего нет. Он недоступен на диске, пока не будет получен через сеть; когда данные из сети получены, они сначала кэшируются в памяти (кеш первого уровня) в виде пар ключ-значение, и в то же время кешируются в файле или sqlite (кеш второго уровня). Примечание. Кэш памяти вызовет утечку памяти в виде кучи. Все кеши уровня 1 обычно должны строго контролировать размер кеша, обычно контролируемый на 1/4 системной памяти.
Автономное кэширование предназначено для локального сохранения данных, полученных с сервера, когда сеть разблокирована, и прямого чтения данных из локального файла, когда сеть отключена. Суть в том, чтобы контролировать хранение и чтение файлов.
Наши приложения обычно генерируют следующие типы данных:
файл - обычное файловое хранилище
файл базы данных (файл .db)
sharedPreference- данные конфигурации (файл .xml)
файл кэша изображений
Все пути к данным в приложении:
/data/data/com.xxx.xxx/cache-in-app cache (Примечание: соответствующий метод getCacheDir ())
/data/data/com.xxx.xxx/databases-in-app база данных
/data/data/com.xxx.xxx/shared_prefs-in-app файл конфигурации
/data/data/com.xxx.xxx/files-In-app files (Примечание: соответствующий метод getFilesDir ())
Файл SD-карты (разработан индивидуально)
Независимо от того, внутренняя это или внешняя SD-карта, способ получения пути один и тот же:
Получите корневой каталог SD-карты: Environment.getExternalStorageDirectory (). GetAbsolutePath ();
Путь к внешнему кэшу: /mnt/sdcard/android/data/com.xxx.xxx/cache Общее хранилище данных кеша (Примечание: получено с помощью getExternalCacheDir ())
Путь к внешнему файлу: /mnt/sdcard/android/data/com.xxx.xxx/files Хранить долгоживущие данные (Примечание: полученные с помощью getExternalFilesDir (тип String), тип специфичен Тип, может быть любым из следующих
Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_PODCASTS, Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS, Environment.DIRECTORY_PICTURES, or Environment.DIRECTORY_MOVIES. )
Пять основных методов хранения данных на платформе Android:
1 Используйте SharedPreferences для хранения данных
2 Данные для хранения файлов
3 База данных SQLite для хранения данных
4 Используйте ContentProvider для хранения данных
5 Данные сетевого хранилища
Следующее знакомит с использованием первых двух, база данных может использовать библиотеку более удобно, например: greenDao; другие, но не слишком много введения. В основном ввести кеш.
(1) Подробное объяснение SharedPreferences
Шаги по использованию SharedPreferences для сохранения пар ключ-значение обычно следующие:
Используйте метод getSharedPreferences класса Activity, чтобы получить объект SharedPreferences, укажите имя файла и права доступа
Получите объект SharedPreferences.Editor и используйте метод putXxx объекта для сохранения пары "ключ-значение".
Сохранение (отправка) пар "ключ-значение" с помощью метода фиксации SharedPreferences.Editor.
(1) Два способа получить SharedPreferences:
1 Вызовите метод getSharedPreferences () объекта Context
2 Вызовите метод getPreferences () объекта Activity.
(2) Разница между двумя методами:
Объект SharedPreferences, полученный путем вызова метода getSharedPreferences () объекта Context, может использоваться другими приложениями в том же приложении.Компонентыобщий.
Объект SharedPreferences, полученный путем вызова метода getPreferences () объекта Activity, может использоваться только в Activity.
(3) Четыре режима работы SharedPreferences:
Context.MODE_PRIVATE: это режим работы по умолчанию, что означает, что файл является личными данными и может быть доступен только самому приложению. В этом режиме записанное содержимое будет перезаписывать содержимое исходного файла.
Context.MODE_APPEND: режим проверит, существует ли файл, добавит содержимое в файл, если он существует, или создаст новый файл.
Context.MODE_WORLD_READABLE и Context.MODE_WORLD_WRITEABLE используются, чтобы контролировать, есть ли у других приложений разрешение на чтение и запись файла.
MODE_WORLD_READABLE: указывает, что текущий файл может быть прочитан другими приложениями.
MODE_WORLD_WRITEABLE: указывает, что текущий файл может быть записан другими приложениями.
(4) Сохраните данные в SharedPreferences:
Или следующее письмо также может быть
(5) Получите данные из SharedPreferences:
(2) Подробное описание хранилища файлов (Файл)
Файловое хранилище - это самый простой способ хранения данных в Android. Он не форматирует сохраненный контент, и все данные сохраняются в файле без изменений. Он больше подходит для хранения простых текстовых или двоичных данных. Если вы хотите использовать метод хранения файлов для сохранения некоторых более сложных текстовых данных, вам необходимо определить набор собственных спецификаций формата, чтобы облегчить повторный анализ файла позже.
(1) Методы хранения файлов, предоставляемые Context (openFileOutput, openFileInput)
- Предоставляется в классе ContextopenFileOutput()Метод, который можно использовать для хранения данных в указанном файле.
- Этот метод принимает два параметра. Первый параметр - это имя, используемое при создании файла. Обратите внимание, что указанное здесь имя файла не может включать путь, поскольку все файлы по умолчанию хранятся в / data / data / <имя пакета> / files /. Под каталогом.
- Второй параметр - это режим работы файла.Есть два основных режима на выбор: MODE_PRIVATE (перезапись исходного текста) и MODE_APPEND (дополнительный контент).
- Метод openFileOutput () возвращает объект FileOutputStream.После получения этого объекта вы можете записывать данные в файл в потоке Java.
(I) Сохраните фрагмент текстового содержимого в файл:
Примечание. По умолчанию файл будет храниться в / data / data / package / files;
Подобно хранению данных в файле, класс Context также предоставляетopenFileInput()Метод чтения данных из файла.
Метод openFileInput () получает только один параметр, то есть имя файла для чтения, и система автоматически перейдет в каталог / data / data / <package name> / files /, чтобы загрузить этот файл и вернуть объект FileInputStream.
(II) Покажите, как читать текстовые данные из файла:
(III) Четыре режима сохранения файлов.
Context.MODE_PRIVATE - это режим работы по умолчанию, что означает, что файл является личными данными и может быть доступен только самому приложению. Содержимое, записанное в этом режиме, перезапишет содержимое исходного файла.
Context.MODE_APPEND Проверьте, существует ли файл, и добавьте содержимое в файл, если он существует, в противном случае создайте новый файл.
MODE_WORLD_READABLE означает, что текущий файл может быть прочитан другими приложениями.
MODE_WORLD_WRITEABLE означает, что текущий файл может быть записан другими приложениями.
(2) Внутренняя память: файл общих операций потока ввода-вывода
Обратите внимание, что внутренняя память - это не память. Внутреннее хранилище находится в очень особенном месте в системе. Если вы хотите хранить файлы во внутреннем хранилище, по умолчанию файлы доступны только вашему приложению, и все файлы, созданные приложением, имеют то же имя, что и пакет приложения. Под содержимым. Другими словами, файлы, созданные приложением во внутренней памяти, связаны с этим приложением. При удалении приложения эти файлы во внутренней памяти также удаляются. С технической точки зрения, если вы устанавливаете атрибут файла для чтения при создании файла внутреннего хранилища, другие приложения могут получить доступ к данным вашего собственного приложения при условии, что он знает имя пакета вашего приложения, если атрибут файла является частным (частным ), то другие приложения не смогут получить к нему доступ, даже если вы знаете имя пакета. Внутреннее пространство для хранения очень ограничено, поэтому оно очень ценно. Кроме того, оно также является основным местом хранения данных для самой системы и системных приложений. Когда внутреннее пространство для хранения исчерпано, телефоном нельзя пользоваться. Таким образом, мы должны стараться избегать использования внутренней памяти. Общие настройки и базы данных SQLite хранятся во внутренней памяти. Внутреннее хранилище обычно использует контекст для получения и работы.
getFilesDir()Получите внутреннее хранилище вашего приложения, которое эквивалентно корневому каталогу вашего приложения во внутреннем хранилище.
После установки приложения / data / data / packagename будет сгенерирован в корневом каталоге Android, и текущему приложению не требуются разрешения на чтение и запись для чтения.
нота:
Некоторые разработчики, возможно, видели корневой каталог приложения / data / user / 0 / packagename, вот объяснение, версия Android 4.2 добавляет функцию входа в систему для разных пользователей на одном устройстве. (По причинам, связанным с патентом, эта функция ограничена планшетами, мобильные телефоны не поддерживают эту функцию), поэтому, чтобы различать настройки и сохраненные данные разных пользователей в одном приложении, добавляется путь этой серии, который указывает на / data / data / packagename
- Метод getFileDir () получает объект File папки с файлами в каталоге.
- Метод getChacheDir () получает объект File из папки кеша в этом каталоге.
- Вызов метода openFileOutput (String name, int mode) ContextWrapper напрямую также создаст соответствующий файл в папке файлов в этом каталоге, и он будет частным. Его можно изменить, чтобы он был доступен другим приложениям, с помощью параметра режима метода openFileOutput для завершения
нота:
Этот каталог можно просмотреть только с правами root и будет удален при удалении приложения.
Очистка данных в деталях приложения приведет к удалению всех данных под именем пакета и всего каталога / Android / data / packagename во внутреннем хранилище и на внешней SD-карте.
Очистка кеша в деталях приложения приведет к удалению всех данных в каталоге packagename / cache и всего каталога / Android / data / packagename / cache во внутренней памяти и на внешней памяти SD-карты.
Если вы хотите создать файл, выполните следующие действия.
Android также предоставляет нам простой способopenFileOutput()`Для чтения и записи файлов во внутренней памяти ниже приведен пример записи текста в файл: (см. Выше)
Некоторые другие операции с внутренней памятью:
A. Перечислите все созданные файлы, это может быть непросто, Context Есть такой способ.
Б. Чтобы удалить файл, если вы можете его создать, вы должны иметь возможность удалить его. Конечно, он также предоставляет интерфейс для удаления файлов. Это также очень просто. Вам нужно только указать имя файла.
C. Чтобы создать каталог, вам необходимо передать имя каталога, и он возвращает файловый объект, используя путь к операции
Обобщая файловые операции, мы можем получить следующие три характеристики:
- Файловым операциям нужно только предоставить функции имя файла, поэтому самой программе нужно только поддерживать имя файла;
- Вам не нужно самостоятельно создавать файловые объекты и потоки ввода и вывода. Вы можете возвращать объекты File или потоки ввода и вывода, указав имя файла.
- Все операции с путями возвращают файловые объекты.
(3) Внешнее хранилище: ввод-вывод (чтение и запись файлов на SD-карте)
Путь хранения собственного ПЗУ телефона
1. Метод getExternalCacheDir () для получения пути к каталогу / Android / data / packagename / cache на встроенной карте памяти, разрешения на чтение и запись не требуются после версии 4.4 и будут удалены по мере удаления приложения.
2. Метод getExternalFilesDir () получает путь к каталогу / Android / data / packagename / files на встроенной карте памяти. После версии 4.4 разрешения на чтение и запись не требуются и будут удалены по мере удаления приложения. Если параметр метода имеет значение «null», вложенная папка не указана. Если указано, создается вложенная папка для сохранения файла. Созданный файл может быть прочитан другими приложениями, если у него есть разрешения на чтение и запись. Если вы хотите сохранить его частным, используйте внутреннее хранилище.
3. Метод Environment.getExternalStorageDirectory () получает корневой каталог каталога встроенного хранилища. Требуются разрешения на чтение и запись, которые не будут удалены при удалении приложения.
4. Метод Environment.getExternalStoragePublicDirectory () получает общедоступный каталог с файлом определенного типа по корневому пути каталога встроенного хранилища. Требуются разрешения на чтение и запись, которые не будут удалены при удалении приложения.
5. Обратите внимание, что разрешения на чтение и запись для пути / Android / data / packagenaem / во встроенном хранилище различаются и требуют разных разрешений, поэтому при разработке всегда следует объявлять разрешения на чтение и запись.
Этапы чтения и записи выполняются следующим образом:
1. Вызовите метод getExternalStorageState () среды Environment, чтобы определить, вставлена ли SD-карта в телефон и есть ли у приложения разрешение на чтение и запись на SD-карту. Следующий код вернет истину.
2. Вызовите метод Environment.getExternalStorageDirectory (), чтобы получить внешнее хранилище, которое является каталогом SD-карты, или используйте каталог «/ mnt / sdcard /».
3. Используйте поток ввода-вывода для работы с файлами на SD-карте.
Примечание. В мобильный телефон должна быть вставлена SD-карта. Для симулятора вы можете создать виртуальную карту памяти с помощью команды mksdcard.
Разрешение на чтение и запись SD-карты должно быть настроено в AndroidManifest.xml.
(I) Функция операции записи файла
II) Функция чтения файла
Общее хранилище:
Небольшое тело данных, параметр, значение (хранится в shared_prefs)
сетевые данные json (данные такого типа обычно не большие, хранятся в файле (.txt и т. д.))
картинки, музыка, видео (рекомендуется хранить большие данные на SD-карте, изображения (кадры с кадрами))
Читайте также: