2013-04-28 76 views
0

我有這樣的代碼來創建CountdownTimer:從另一個活動重新啓動CountDownTimer

CountDownTimer CountdownTimer = new CountDownTimer(30000, 1000) { 
public void onTick(long millisUntilFinished) { 
    txttime.setText(millisUntilFinished/1000); 
} 

public void onFinish(){ 
    timeout_stage(); 
} 

}。開始();

它工作正常,我可以取消並完美啓動,但我想從其他活動重新啓動它。在主窗體中,我將它打開,一個活動打開,就像一個有「再次」按鈕的對話框。當我點擊那個,我想CountDownTimer.start();叫我的計數器再次重新啓動...

我怎麼能做到這一點?

我這樣做的第二個活動:

MainActivity main = new MainActivity(); 
main.CountdownTimer.start(); 

,但我得到這個錯誤:

04-28 11:42:40.495: E/AndroidRuntime(17039): FATAL EXCEPTION: main 
04-28 11:42:40.495: E/AndroidRuntime(17039): java.lang.NullPointerException 
04-28 11:42:40.495: E/AndroidRuntime(17039): at com.english.game.MainActivity$1.onTick(MainActivity.java:70) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:124) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at android.os.Looper.loop(Looper.java:137) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at java.lang.reflect.Method.invoke(Method.java:511) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-28 11:42:40.495: E/AndroidRuntime(17039): at dalvik.system.NativeStart.main(Native Method) 
+0

你在'onTick'的'MainActivity'的第70行得到'NullPointerException'那一行是什麼? – thepoosh 2013-04-28 07:36:30

+0

this:txttime.setText(millisUntilFinished/1000); – Fcoder 2013-04-28 07:37:48

+0

但是,當我在同一活動中調用它時,它的功能完美 – Fcoder 2013-04-28 07:38:21

回答

0
  1. 您可以在活動1創建靜態處理程序,並從那裏開始你countDownTimer。
  2. 在第二個活動中,您可以通過Activity1.hander訪問靜態處理程序實例,並且您可以從此處發送消息以啓動或取消countDownTimer。

不要使用new運算符創建Activity1的實例,而應使用Handler

Activity1.java

public class Activity1 extends Activity { 
public static Handler mHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    initHandler(); 
    mHandler.sendEmptyMessage(1); 

    startActivity(new Intent(Activity1.this, Activity2.class)); 
} 

private void initHandler(){ 
    mHandler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.arg1) { 
      case 1: 
       mCountDownTimer.start(); 
       break; 
      } 
     } 
    }; 
} 

private CountDownTimer mCountDownTimer = new CountDownTimer(10000, 1000) { 
    @Override 
    public void onTick(long millisUntilFinished) { 
     Toast.makeText(Activity1.this, "Count is: "+ millisUntilFinished/1000, Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onFinish() { 
     // TODO Auto-generated method stub 

    } 
}; 
} 

Activity2.java

public class Activity2 extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Activity1.mHandler.sendEmptyMessage(1); 

} 
} 

此示例代碼僅僅是做的想法,請使用此邏輯,讓我知道,如果有任何問題來了...

+0

您能舉個例子嗎?我不能理解,我搜索的處理程序,但... – Fcoder 2013-04-28 08:02:27

+0

@FarhadShirzad檢查此示例代碼.. – 2013-04-28 09:10:19

+0

我這樣做,但即使在活動1內mHandler.sendEmptyMessage(1);不工作和handleMessage不解僱!請幫助我親愛的朋友,我困惑了2天 – Fcoder 2013-04-29 06:49:13

0

我不確定,因爲沒有足夠的代碼來做適當的分析,bu噸至我這些行看上去是錯誤的:

MainActivity main = new MainActivity(); 
main.CountdownTimer.start(); 

當初始化主要活動這種方式,沒有任何活動的生命週期方法(的onCreate(),在onStart()等)被調用。我的猜測是,txttime(label?)是在onCreate()中初始化的。

此外(和imho更糟),您不會重新啓動實際主要活動中使用的計時器。

爲確保您在第二次活動中擁有正確的主要活動,我建議您使用this answer中的代碼。