我有这个代码来创建一个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 :(得分:0)
不要使用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中的代码。