简体   繁体   English

从另一个活动重启CountDownTimer

[英]restarting CountDownTimer from another activity

i have this code to create a CountdownTimer: 我有这段代码来创建一个CountdownTimer:

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

 public void onFinish(){
     timeout_stage();
 }

}.start(); }。开始();

it works fine and i can cancel and start it perfectly, but i want to restart it from another activity. 它工作正常,我可以取消并完美启动它,但是我想从其他活动中重新启动它。 in main form i cancell it, the an activity opens like a dialogbox that has a "AGAIN" button. 在我取消的主要形式中,活动将像具有“再次”按钮的对话框一样打开。 when i click on that, i want to CountDownTimer.start(); 当我单击该按钮时,我想要CountDownTimer.start(); called and my counter restarts again... 调用,我的计数器再次重新启动...

how i can do this? 我该怎么做?

i do this in second activity: 我在第二个活动中这样做:

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

but i get this error: 但我得到这个错误:

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)
  1. You can create static handler in Activity1 and start your countDownTimer from there. 您可以在Activity1中创建静态处理程序,然后从此处启动countDownTimer。
  2. In second Activity you can access the static handler instance by Activity1.hander and you can send message from here to start or cancel the countDownTimer. 在第二个Activity中,您可以通过Activity1.hander访问静态处理程序实例,并且可以从此处发送消息以启动或取消countDownTimer。

Don't create the instance of Activity1 by using new operator, instead this use Handler . 不要使用new运算符创建Activity1的实例,而是使用Handler

Activity1.java 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 Activity2.java

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

    Activity1.mHandler.sendEmptyMessage(1);

}
}

This sample code is only idea to do, please use this logic and let me know if any problem is coming... 此示例代码仅供参考,请使用此逻辑,让我知道是否有任何问题...

I am not sure, because there is not enough code to do a proper analysis, but to me these lines look wrong: 我不确定,因为没有足够的代码来进行适当的分析,但是对我来说,这些行看起来是错误的:

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

When you initialize the main activity this way, no activity life cycle methods (onCreate(), onStart(), etc.) are called. 以这种方式初始化主要活动时,不会调用活动生命周期方法(onCreate(),onStart()等)。 My guess is, that the txttime (label?) is initialized in onCreate(). 我的猜测是, txttime (标签?)是在onCreate()中初始化的。

Additionally (and imho even worse), you would not restart the timer used in the actual main activity. 另外,(恕我直言,更糟糕的是)您不会重新启动实际主要活动中使用的计时器。

To ensure you have the correct main activity in your second activity I woud suggest you use the code from this answer . 为了确保您在第二项活动中有正确的主要活动,我建议您使用此答案中的代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM