2015-09-27 49 views
0

我已經目前在我的Java文件中創建一個新的CountDownTimer對象的值,然後我有一個計時器已經在那裏它使已經所需功能的另一個新CountDownTimer對象的onFinish()方法在它自己的onFinish()方法中。對象,要求他們修改用於別處

但是,當我在第二個定時器之外創建一個布爾值(並將其保持爲false),然後嘗試在第二個定時器的onFinish()方法中將此布爾值修改爲true時,它會給出錯誤:「Variable [布爾變量名稱]從內部類訪問,需要聲明爲最終「。

當我聲明變量最後,雖然我絕對不能修改。

那麼,什麼是着手解決這一問題的最有效方法是什麼?我不能失去定時器的功能,但我對java的使用非常淺薄。如果這個問題看起來很愚蠢,我很抱歉。

我很想也使用像一個getter/setter方法,但有一個計時器,我不知道,即使是有效的。

謝謝大家誰提前回復!非常感謝! :)

爲了清楚起見:我需要定時器設置一個布爾標誌,將檢測到的第二計時器確實已經完成。這會將布爾標誌設置爲true,然後修改我創建的按鈕的功能。以類似的方式我也希望這第二個定時器初始化一個長整型值之外吧被引用爲好。

如果布爾=假,則該按鈕可引起拒絕用戶的。
如果布爾=真,那麼按鈕接受用戶。
然後我用下面獲得的長號碼。

代碼的要求:

boolean clickAppropriate = false; 

new CountDownTimer(t1, t2) { 
    public void onTick(long millisUntilFinished) { 
    } 

    public void onFinish() { 
     mTextField.setText("text"); 

     new CountDownTimer(t3, t4) { 
      public void onTick(long millisUntilFinished) { 

      public void onFinish() { 
       long startTime = System.nanoTime(); 

       clickAppropriate = true; 
      } 
     }.start(); 

    } 
}.start(); 
+2

在[最小,完整和可驗證示例]中顯示代碼相關代碼(http://stackoverflow.com/help/mcve) – Andreas

回答

0
我在這裏看到,而無需修改您的解決方案的結構

最簡單的解決是選擇'final布爾[] clickAppropriate =新的布爾[1]「,並與'clickAppropriate [0工作]'元素。如果您使用多線程環境,選擇AtomicBoolean可能會帶來額外的好處。

0

可以一起使用this關鍵字與外班(其中布爾聲明類)名稱來訪問它的成員。

例子:

public class Outer { 
    public boolean bool = false; 
    public class Inner { 
     public void displayOuterClassVariable() { 
      System.out.println(Outer.this.bool); 
     } 
    } 
} 

在你的情況,你需要與clickApprpriate使用外部類的名字。但似乎你的變量是在一個方法中聲明的。您必須將該變量放在類中才能使用此語法。

0

這是一個有趣的問題。您目前構建代碼的方式,將無法在您的匿名CountDownTimer類聲明中更改您的clickAppropriate變量的內容。

這是甲骨文在寫入方面,從匿名類中訪問局部變量:

「一位不願具名的類中未聲明爲final或有效最終其封閉的範圍無法訪問本地變量。」

http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

這就是爲什麼你的編譯器是給你這個錯誤的原因。

您可以從您的匿名類中訪問和更改您的clickApproriate變量的一種方法是將此變量從局部變量更改爲類變量。

我能夠成功編譯下面的代碼沒有任何錯誤。

public class Main 
{ 
    static boolean clickAppropriate; 

    public static void main(String args[]) 
    {  
     clickAppropriate = false;   

     new CountDownTimer() 
     {      
      public void onFinish() 
      {     
       clickAppropriate = true; 
      }; 

     }.start(); 
    } 
} 

一兩件事,我要指出的是並不明顯 - 您的匿名類的使用是影響覆蓋在類文件中聲明的任何代碼。例如,每次你宣佈你的匿名類CountDownTimer如下:

new CountDownTimer(t1, t2) { 
    public void onTick(long millisUntilFinished) { 
    } 
}; 

這在onTick()方法可能存在於CountDownTimer類文件重寫任何代碼。當onTick()方法是抽象的時候,這是正確的,但如果此方法是常規類方法,則可能不是您想要的。祝你好運。