Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一次刷新多个领域实例?_Java_Android_Multithreading_Realm_Event Bus - Fatal编程技术网

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 + "]");
    }
}