2014-01-22 4 views
0

У меня есть список пользовательских объектов ... эти объекты просто отслеживают несколько моих сайтов для любых новых данных, которые пользователи могут добавить. Я сохраняю эти объекты в статическом списке <>, который является членом конечного класса .... Я создаю службу для прохождения списка с заданным интервалом и обновления по мере необходимости.Объекты просто исчезают через несколько часов (Android)

final public class MonitorHandler { 
    public static List<MonitorSettings> monitorsSettings = new ArrayList<MonitorSettings>(); 

    ect.... 

} 

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

ответ

1

Почему это?

Ваш процесс был прерван.

Не статические объекты сохраняются даже после закрытия приложения или отправки на задний план?

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

Если у вас есть данные, которые вы хотите повесить, сохраните их в постоянном режиме, используя базу данных, файл или SharedPreferences.

+0

Могу ли я добавить список <> в SharedPreferences? –

+0

@SteveJpbs: вы можете поместить 'Set ' в 'SharedPreferences' на уровне API 11+. – CommonsWare

+0

Хмм, что не будет работать ... объект MonitorSettings - это нечто сложное. –

1

Почему это? не статические объекты сохраняются даже после закрытия приложения или отправки на задний план?

Нет, если ваше приложение фактически закрыто системой, это может случиться. Вы должны войти в свой Service.onDestroy(), чтобы убедиться, что это действительно причина, но не гарантирует, что onDestroy будет на самом деле вызван.

Таким образом, вы должны сохранять свои данные в некоторых хранилищах, предпочтительнее SharedPreferences или DB-sqlite.

0

У вас недостаточно кода, чтобы быть уверенным, но очень вероятно, что вы не держите ссылку на свои данные в любом месте приложения, кроме статических элементов класса MonitorHandler. Dalvik VM будет время от времени выгружать классы без ссылок, поэтому при следующем запуске класса он перезагружается, статическая инициализация повторно запускается, и вы получаете новый пустой список.

Суть в том, что класс , на который вы можете положиться, не будучи выгруженным во время исполнения вашего приложения Android, является самим классом Application.

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

import android.app.Application; 
import android.content.Context; 
import com.example.DiskLruImageCache; 

import java.util.ArrayList; 
import java.util.List; 

public class TestApp extends Application { 

    static final public int CACHE_SIZE = 1024 * 1024 * 15;  // 15MB 
    private static List<String> stringList = new ArrayList<String>(); 
    private static DiskLruImageCache imageCache = null; 
    private static Context context; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context = this; 
    } 

    public static List<String> getStringList() { 
     return stringList; 
    } 

    static public DiskLruImageCache getImageCache() { 
     if(imageCache == null) { 
      synchronized(context) { 
       if(imageCache == null) 
        imageCache = new DiskLruImageCache(context, "TestImages", CACHE_SIZE); 
      } 
     } 
     return imageCache; 
    } 

} 

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

+0

Как насчет размещения статического списка <> в самой службе .. это будет хорошо или плохой практикой? –

+0

«Dalvik VM время от времени будет выгружать классы без ссылок» - не по словам парня, который, вероятно, написал эту часть виртуальной машины: http://stackoverflow.com/questions/18840093/is-it-still-the- case-that-android-never-unloads-classes – CommonsWare

+0

@SteveJpbs Нет, включение его в службу не работает - служба не гарантируется и в памяти. Я прошел все эти итерации в своих приложениях, и использование класса Application - единственное, что работает. – Clyde

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