2017-10-14 89 views
-1

我在類中創建一個Runnable:變量的Runnable

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

這裏,玩的就是我的類的實例變量。

但是,當我打電話給我的Runnable:

handler.postDelayed(monRun, 100); 

變量該劇在Runnable的拍攝,如果我在類的其他方法改變值,該劇將不會在我的Runnable

回答

0
改變

這是發生,因爲你在你的主threadplay實例變量,你在不同的thread更新這個變量。

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()) { 
      /* [...] */ 
     } 
    } 
}; 

的​​關鍵字是爲了避免與戲劇部件線程安全問題。如果Runnable被稱爲在同一個線程可以(而且應該)只是避免​​。

我也建議你通過類特性符合Runnable接口的構造函數傳遞,而不是使用每對象實現的ObjectToPass參考。這將幫助你更好地處理數據:

class MyRunnable implements Runnable { 

    private ObjectToPass play; 

    public MyRunnable(ObjectToPass play) { 
     this.play = play; 
    } 

    @Override public void run() { 
     ... 
    } 
} 
+0

但我的變量發揮,我可運行在一個服務... – Luzwitz

+0

等什麼?只需傳遞MyRunnable對象而不是Runnable。 – NoImaginationGuy