从另一个活动重新启动CountDownTimer

时间:2013-04-28 07:33:02

标签: java android

我有这个代码来创建一个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)

2 个答案:

答案 0 :(得分:0)

  1. 您可以在Activity1中创建静态处理程序,并从那里开始您的countDownTimer。
  2. 在第二个Activity中,您可以通过 Activity1.hander 访问静态处理程序实例,您可以从此处发送消息以启动或取消countDownTimer。
  3. 不要使用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);
    
    }
    }
    

    此示例代码仅供参考,请使用此逻辑并告知我是否有任何问题......

答案 1 :(得分:0)

我不确定,因为没有足够的代码来进行正确的分析,但对我来说这些行看起来不对:

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

以这种方式初始化主活动时,不会调用任何活动生命周期方法(onCreate(),onStart()等)。我的猜测是,txttime(标签?)是在onCreate()中初始化的。

此外(并且甚至更糟),您不会重新启动实际主要活动中使用的计时器。

为确保您在第二项活动中拥有正确的主要活动,我建议您使用this answer中的代码。