Java 一次刷新多个领域实例?
我使用的设置是,每个Java 一次刷新多个领域实例?,java,android,multithreading,realm,event-bus,Java,Android,Multithreading,Realm,Event Bus,我使用的设置是,每个演示者都有自己的领域实例,它是一个保留的片段。然而,这本质上意味着这些领域都在主线程上 现在这也意味着,如果我想修改领域,我要么需要在主线程上进行修改(这对于小数据集来说是可以的,但我真的不想在大数据集上进行),要么需要在后台线程上进行修改,并一次刷新每个领域实例(对于事件总线的简单事件,这是可能的) 但是假设我在主线程上打开了大约5-7个领域实例(因为每个演示者都有自己的开放领域,而它们并没有被破坏),我关心的是性能和/或内存使用情况 所以我想我有两个问题 1.)在主线程上
演示者
都有自己的领域
实例,它是一个保留的片段。然而,这本质上意味着这些领域都在主线程上
现在这也意味着,如果我想修改领域,我要么需要在主线程上进行修改(这对于小数据集来说是可以的,但我真的不想在大数据集上进行),要么需要在后台线程上进行修改,并一次刷新每个领域实例(对于事件总线的简单事件,这是可能的)
但是假设我在主线程上打开了大约5-7个领域实例(因为每个演示者都有自己的开放领域,而它们并没有被破坏),我关心的是性能和/或内存使用情况
所以我想我有两个问题
1.)在主线程上打开多个领域实例是否是一种不良做法/资源密集型做法
2.)使用全局刷新事件更新同一线程上的多个域的资源密集程度如何?域在pr.Realm文件内部使用ThreadLocal缓存,因此在您拥有的每个活动/片段/演示器中调用Realm.getInstance()
。第一次调用Realm.getInstance()
需要花费一点时间,因为必须打开数据库并验证模式,但之后只需要进行缓存查找
缓存是引用计数的,因此只有在关闭所有实例后才会释放本机资源。这意味着尽可能长时间地保持至少一个开放实例是有益的
这也意味着,当您更新其中一个打开的实例时,它们都会自动更新。这是一种在应用程序处于活动状态时始终拥有打开领域的可能方式
public class BaseActivity extends AppCompatActivity {
private CustomApplication customApplication;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
customApplication = (CustomApplication)getApplication();
if(savedInstanceState == null) {
customApplication.incrementActivityCounter();
}
}
@Override
protected void onDestroy() {
if(isFinishing()) {
customApplication.decrementActivityCounter();
}
super.onDestroy();
}
}
public class CustomApplication extends Application {
public static final String TAG = CustomApplication.class.getSimpleName();
private volatile int activityCounter = 0;
private Realm realm;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "Application onCreate() called.");
initializeRealm();
}
public void incrementActivityCounter() {
if (activityCounter == 0) {
Log.d(TAG, "Increment: Activity counter was 0, initializing Realm.");
if(realm == null) {
initializeRealm();
}
}
activityCounter++;
Log.d(TAG, "Increment: Activity counter incremented to " + activityCounter + ".");
}
public void decrementActivityCounter() {
activityCounter--;
Log.d(TAG, "Decrement: Activity counter decremented to " + activityCounter + ".");
if(activityCounter == 0) {
realm.close();
realm = null;
Log.d(TAG, "Decrement: Activity counter was 0, closed realm.");
}
}
private void initializeRealm() {
realm = Realm.getInstance(this);
Log.d(TAG, "Realm initialized.");
}
public Realm getRealm() {
return realm;
}
public int getActivityCounter() {
return activityCounter;
}
public void setActivityCounter(int activityCounter) {
this.activityCounter = activityCounter; //process death
}
}
然后
public class BaseActivity
extends AppCompatActivity {
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("activityCounter", ((CustomApplication) getApplication()).getActivityCounter());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
int activityCounter = savedInstanceState.getInt("activityCounter");
((CustomApplication) getApplication()).setActivityCounter(activityCounter); //fix process death initializing activity counter to 0
Log.d(TAG, "Reset activity counter in application after process death to [" + activityCounter + "]");
}
}
啊,在这种情况下,我应该确保只更新一个实例,这样我就不会调用refresh()
方法N次。但是,我一次只能访问一个领域,我想对refresh()
的调用不应该是全局的,只在主线程上的一个实例上调用。整洁的谢谢你的回答:)等等,这是否意味着我可以给一个处理程序一个runnable,该处理程序向主循环器发送消息,主循环器获取一个领域实例,调用refresh,然后关闭它-并刷新主线程上的每个领域?是的,这应该可以工作,但我们已经为你这样做了:)。如果您有一个域在后台线程上写入数据,那么它已经向主循环器发送了一条消息,要求在您提交事务时更新所有域。这里也调用了onChange侦听器。那就更棒了。谢谢。等一下,这不是只有在后台线程附加了一个循环器时才正确吗?
public class BaseActivity extends AppCompatActivity {
private CustomApplication customApplication;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
customApplication = (CustomApplication)getApplication();
if(savedInstanceState == null) {
customApplication.incrementActivityCounter();
}
}
@Override
protected void onDestroy() {
if(isFinishing()) {
customApplication.decrementActivityCounter();
}
super.onDestroy();
}
}
public class CustomApplication extends Application {
public static final String TAG = CustomApplication.class.getSimpleName();
private volatile int activityCounter = 0;
private Realm realm;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "Application onCreate() called.");
initializeRealm();
}
public void incrementActivityCounter() {
if (activityCounter == 0) {
Log.d(TAG, "Increment: Activity counter was 0, initializing Realm.");
if(realm == null) {
initializeRealm();
}
}
activityCounter++;
Log.d(TAG, "Increment: Activity counter incremented to " + activityCounter + ".");
}
public void decrementActivityCounter() {
activityCounter--;
Log.d(TAG, "Decrement: Activity counter decremented to " + activityCounter + ".");
if(activityCounter == 0) {
realm.close();
realm = null;
Log.d(TAG, "Decrement: Activity counter was 0, closed realm.");
}
}
private void initializeRealm() {
realm = Realm.getInstance(this);
Log.d(TAG, "Realm initialized.");
}
public Realm getRealm() {
return realm;
}
public int getActivityCounter() {
return activityCounter;
}
public void setActivityCounter(int activityCounter) {
this.activityCounter = activityCounter; //process death
}
}
public class BaseActivity
extends AppCompatActivity {
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("activityCounter", ((CustomApplication) getApplication()).getActivityCounter());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
int activityCounter = savedInstanceState.getInt("activityCounter");
((CustomApplication) getApplication()).setActivityCounter(activityCounter); //fix process death initializing activity counter to 0
Log.d(TAG, "Reset activity counter in application after process death to [" + activityCounter + "]");
}
}