public class NewClass extends UiApplication
{
public static Timer s1;
public static int remain =0;
public static void main(String[] args)
{
NewClass app = new NewClass();
s1 = new Timer();
s1.scheduleAtFixedRate(new TimerMainEvent(),1000,1000);
NewClass.remain = 50;
op provider = new op();
OptionsManager.registerOptionsProvider(provider);
app.enterEventDispatcher();
}
public NewClass()
{
pushScreen(new testscreen());
}
}
class testscreen extends MainScreen {
public testscreen(){
super();
ButtonField b1 = new ButtonField("test",ButtonField.CONSUME_CLICK);
add(b1);
b1.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
NewClass.remain = 100;
System.out.println("****Log****:now ="+ NewClass.remain);
if(NewClass.s1 != null){
System.out.println("****Log****:turn off s1");
NewClass.s1.cancel();
}
}
});
}
}
class TimerMainEvent extends TimerTask {
public TimerMainEvent() {
}
public void run() {
System.out.println("****Log****:now ="+ NewClass.remain);
}
}
class op implements OptionsProvider {
public op(){
}
public String getTitle() {
return "aaa";
}
public void populateMainScreen(final MainScreen mainScreen) {
ButtonField b1 = new ButtonField("test",ButtonField.CONSUME_CLICK);
mainScreen.add(b1);
b1.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
NewClass.remain = 100;
System.out.println("****Log****:now ="+ NewClass.remain);
if(NewClass.s1 != null){
System.out.println("****Log****:turn off s1");
NewClass.s1.cancel();
}
}
});
}
public void save() {
};
}
以上代码:如果是OptionsProvider中的mainscreen按钮test按下时,NewClass.s1是null的,timer会打断。
如果是程序本身的mainscreen的test按钮按下时,NewClass.s1是不等于null的。
队长给的正确答案:op产生的进程导致静态变量不能在另一个进程里调用到,所以一直返回null.
本文探讨了Java中使用Timer类实现定时任务的过程。通过两个不同场景触发定时任务,分析了静态成员变量在不同类实例间的访问问题,并解释了为何在特定情况下静态变量会返回null。

被折叠的 条评论
为什么被折叠?



