2015-12-14 2 views
2

Я использую Realm в проекте. Я построил эту RealmActivity, чтобы легко использовать Realm в коде с getActivity.getRealm().Использование Singleton для Realm в UI-Thread

public abstract class RealmActivity extends AppCompatActivity { 

private Realm realm; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    realm = Realm.getDefaultInstance(); 
    super.onCreate(savedInstanceState); 
} 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (!realm.isClosed()) { 
     realm.close(); 
    } 
} 


public Realm getRealm() { 
    return realm; 
} 

Теперь я хочу удалить файл Realm, чтобы очистить данные для этого сеанса/пользователя. Для этого все RealmInstances должны быть закрыты. Я попытался запустить Logout-Activity с намерением очистить ActivityStack. Он отлично работает для моего Nexus 5 (Android 6), но не для моего Nexus 4 (Android 5).

Моя идея состояла в том, чтобы создать Singleton для RealmInstance, который используется в UI-Thread

public abstract class RealmActivity extends AppCompatActivity { 

private Realm realm; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    realm = ManagerLayer.getInstance().getRealm(); 
    super.onCreate(savedInstanceState); 
} 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
} 


public Realm getRealm() { 
    return realm; 
} 

}

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

Но когда я очищаю ActivityStack и метод onDestroy() не вызывается, RealmInstance для Activity также никогда не закрывается. Правильно?

Могу ли я использовать Singleton для UI-Thread realmInstance? Я никогда не перехожу к другой теме и никогда не закрываю ее. Или есть еще одно решение закрыть все RealmInstances, чтобы удалить RealmFile?

ответ

2

Если вы хотите сохранить экземпляр какого-либо объекта, который необходим для всего приложения, вы должны сохранить этот экземпляр в:

  1. The Application класс, распространив его и установив android:name в AndroidManifest.xml.
  2. Другой класс, который не является компонентом Android, простой класс java.

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

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

+1

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

+0

Я бы также проверил использование getInstance с помощью 'Thread.currentThread() == Looper.getMainLooper(). GetThread()' – droidpl

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