Android 用realm替换全局变量和同步块
我重新措辞这个问题是为了不让人们对我真正在做什么感到困惑。原始问题中使用的示例过于简化 我的项目是基于客户端/服务器的。android应用程序就是客户端。为了恰当地简化这种情况,我们可以认为我有两个意图/活动和一个背景线程。活动A是登录。活动B是应用程序其余部分所在的位置。后台线程是套接字线程,在用户退出应用程序或网络连接中断之前,它需要一直保持运行 实现了一个状态机来处理应用程序状态,所有活动和套接字线程都需要该状态机 Singleton很容易满足我的设计要求,但是会有很多同步块和等待语句。我想知道是否有可能使用领域来实现同样的目标Android 用realm替换全局变量和同步块,android,concurrency,realm,synchronized,Android,Concurrency,Realm,Synchronized,我重新措辞这个问题是为了不让人们对我真正在做什么感到困惑。原始问题中使用的示例过于简化 我的项目是基于客户端/服务器的。android应用程序就是客户端。为了恰当地简化这种情况,我们可以认为我有两个意图/活动和一个背景线程。活动A是登录。活动B是应用程序其余部分所在的位置。后台线程是套接字线程,在用户退出应用程序或网络连接中断之前,它需要一直保持运行 实现了一个状态机来处理应用程序状态,所有活动和套接字线程都需要该状态机 Singleton很容易满足我的设计要求,但是会有很多同步块和等待语句。我
原始问题 我对RealmJava(Android)开发还不熟悉。在我当前的代码中,我有一堆全局变量,并在一些异步任务或后台线程中使用它们 我将在这里使用一些代码来演示我的示例
//Class holding global variable
public class GlobalInfo{
public static String info;
}
//Class changing the global variable
class A{
void doSomething(){
String info = GlobalInfo.info;
info = "start";
synchronized(info){
...... //do something
info = "done";
info.notifyAll();
}
}
}
//background thread waiting for info to be "done". Neglecting the class holding it
void doSomethingAfterDone(){
String info = GlobalInfo.info;
synchronized(info){
while(!info.Equals("done")){
info.wait();
}
//do something
}
}
假设调用doSomethingAfterDone()
时,方法doSomething()
仍在运行。因此,doSomethingAfterDone()
将在退出循环时等待doSomething()
发出通知
是否可以使用领域来替换它们?例如,使用领域事务+等待更改的侦听器,而不是对全局变量应用同步块并等待其通知
我发现Realm.waitForChange()
将阻止执行,直到对其进行更改。但是,应用于注册或复制到领域的任何对象的所有更改是否都会为此语句返回true,而不管更改了什么
我知道我可以在意图之间传递字符串,但我想知道realm是否可以完成这项工作。通常您根本不需要全局变量。您只需在后台线程上写入领域,并在UI线程上侦听更改
//Class holding global variable
//public class GlobalInfo{
//public static String info;
//}
//Class changing the global variable
class A{
void doSomething(){
//String info = GlobalInfo.info;
//info = "start";
//synchronized(info){
try(Realm realm = Realm.getDefaultInstance()) {
realm.executeTransaction(new Realm.Transaction() { // assuming background thread
@Override
public void execute(Realm realm) {
//!! do something with Realm
}
});
}
new Thread(new Runnable() { // could be merged to this background thread
@Override
public void run() {
doSomethingAfterDone();
}
}).start();
//info = "done";
//info.notifyAll();
//}
}
}
//background thread waiting for info to be "done". Neglecting the class holding it
void doSomethingAfterDone(){
//String info = GlobalInfo.info;
//synchronized(info){
//while(!info.Equals("done")){
// info.wait();
//}
try(Realm realm = Realm.getDefaultInstance()) {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//do something
}
});
}
//}
}
当然,您可以将对全局字符串的写入替换为对领域的写入,然后监听领域中的更改。很长一段时间以来,除了检查进程死亡之外,我还没有一个全局变量。就个人而言,我看不出你需要什么“守护进程线程”,它会不断循环并侦听全局变量-你可以在将done
设置为true
时运行任务。你发布的代码示例并不真正使用Realm,但如果info是RealmObject,你就设置了一个字段,我肯定会使用RealmChangeListener。侦听器将触发当前同一类型对象的所有更改,但在继续之前应该很容易检查是否应“完成”有效。@Joe我认为如果套接字线程是设置为自动更新的循环器线程,理论上这是可能的。但我从来没有真正尝试过设置一个活套,并在没有剩余的开放活动时终止它。您最好的选择是查看HandlerThread。非常感谢@EpicPandaforceThread@EpicPandaforceThread的回复,但我不认为您所写的是我的意思doSomethingAfterDone
在一个完全独立的类和线程中。两个线程都引用同一个stringz,它们根据不同的状态更新/侦听同一个字符串。考虑一个异步任务线程、一个后台线程和一个状态机:用户单击某个东西,异步任务就会得到通知,更新状态并等待。后台线程获取新状态,执行一些逻辑并再次更改状态。然后,异步任务被通知后台线程已完成,并更新GUI。如果后台线程从同一GUI或异步任务线程启动,我知道我可以通过此状态机,但如果切换到新的意图/活动时我仍然需要后台线程,该怎么办,新的GUI线程也需要这个状态机?虽然这是可能的,但我也认为这听起来太过工程化了。我更新了我的问题,你能看一下吗?谢谢