Runnable中的变量

时间:2017-10-14 09:35:05

标签: android variables runnable

我在班上创建了一个Runnable:

private Runnable monRun = new Runnable() {
    public void run() {
        Log.i("PLAY", "" + play);
        if(play) {
           /* [...] */
        }
    }
};

这里,play是我班级的实例变量。

但是,当我打电话给我的Runnable时:

handler.postDelayed(monRun, 100);

变量播放在Runnable中捕获,如果我在我班级的其他方法中更改了值,则不会在我的Runnable中更改播放

2 个答案:

答案 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() {
        ...
    }
}