我在班上创建了一个Runnable:
private Runnable monRun = new Runnable() {
public void run() {
Log.i("PLAY", "" + play);
if(play) {
/* [...] */
}
}
};
这里,play是我班级的实例变量。
但是,当我打电话给我的Runnable时:
handler.postDelayed(monRun, 100);
变量播放在Runnable中捕获,如果我在我班级的其他方法中更改了值,则不会在我的Runnable中更改播放
答案 0 :(得分:0)
这种情况正在发生,因为您的主play
中有 thread
实例变量,并且您正在使用不同的thread
更新此变量。
答案 1 :(得分:0)
每个对象实现中的变量和lambda表达式总是被复制,导致这些变量甚至可能超出范围而死亡。让它们复制对象的引用然后。
我建议你将变量播放包含在一个对象中,并将该对象传递给Runnable
:
class ObjectToPass {
boolean play;
public synchronized boolean getPlay() {
return play;
}
public synchronized void setPlay(boolean play) {
this.play = play;
}
}
... // play is a ObjectToPass
private Runnable monRun = new Runnable() {
public void run() {
Log.i("PLAY", "" + play.getVar());
if(play.getVar()) {
/* [...] */
}
}
};
synchronized
关键字是为了避免播放成员的线程安全问题。如果在同一个帖子中调用Runnable
,您可以(而且应该)避免synchronized
。
我还建议您通过符合Runnable的类的构造函数传递对ObjectToPass
的引用,而不是使用per-object实现。这将有助于您更好地处理数据:
class MyRunnable implements Runnable {
private ObjectToPass play;
public MyRunnable(ObjectToPass play) {
this.play = play;
}
@Override public void run() {
...
}
}