Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个活动重新启动倒计时_Java_Android - Fatal编程技术网

Java 从另一个活动重新启动倒计时

Java 从另一个活动重新启动倒计时,java,android,Java,Android,我有以下代码来创建倒计时: CountDownTimer CountdownTimer = new CountDownTimer(30000, 1000) { public void onTick(long millisUntilFinished) { txttime.setText(millisUntilFinished / 1000 ); } public void onFinish(){ timeout_stage(); } }.start() 它工作正常

我有以下代码来创建倒计时:

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

 public void onFinish(){
     timeout_stage();
 }
}.start()

它工作正常,我可以取消并完美地启动它,但我想从另一个活动重新启动它。在主窗体i Cancel中,活动会像对话框一样打开,其中有一个“再次”按钮。当我点击它时,我想要倒计时;我的计数器再次启动

我怎么能做到

我在第二个活动中这样做:

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)
  • 您可以在Activity1中创建静态处理程序,并从此处启动倒计时
  • 在第二个活动中,您可以通过Activity1.hander访问静态处理程序实例,您可以从这里发送消息来启动或取消倒计时
  • 不要使用new运算符创建Activity1的实例,而是使用此运算符

    活动1.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
    
        }
    };
    }
    
    public class Activity2 extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        Activity1.mHandler.sendEmptyMessage(1);
    
    }
    }
    
    Activity2.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
    
        }
    };
    }
    
    public class Activity2 extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        Activity1.mHandler.sendEmptyMessage(1);
    
    }
    }
    

    这个示例代码是唯一的想法做,请使用这个逻辑,让我知道如果有任何问题来

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

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

    此外(更糟糕的是),您不会重新启动实际主活动中使用的计时器


    为了确保您在第二个活动中有正确的主活动,我建议您使用中的代码。

    onTick
    中的
    MainActivity
    的第70行,您得到了一个
    NullPointerException
    ,该行是什么?这是:txttime.setText(millisuntillfinished/1000);但是,当我在同一个活动中调用它时,它可以完美地工作。我这样做,但即使在活动1 mHandler.sendEmptyMessage(1)中也是如此;不起作用,handleMessage不被解雇!请帮助我亲爱的朋友,我困惑了两天