0

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

2 回答 2

0
  1. 您可以在 Activity1 中创建静态处理程序并从那里启动您的 countDownTimer。
  2. 在第二个 Activity 中,您可以通过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);

}
}

这个示例代码只是一个想法,请使用这个逻辑,如果有任何问题,请告诉我......

于 2013-04-28T07:47:00.393 回答
0

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

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

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

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

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

于 2013-04-28T07:52:18.987 回答