我正在尝试理解J2ME代码
Thread aaa = new Thread(pb) { private final ProgressBar val$pb;
public void run() { while (this.val$pb.getValue() < 100) {
try {
this.val$pb.setValue(this.val$pb.getValue() + 1);
Thread.sleep(10L); } catch (InterruptedException ex) {
}
this.val$pb.repaint();
}
mainForm.homeScreen = new HomeScreen();
mainForm.homeScreen.show();
}
};
aaa.start();
请告诉我pb
在Thread
构造函数中做了什么。如果我将new Thread(pb)
更改为new Thread()
,此代码的效果如何?它会影响val$pb
吗?上面的代码无法编译,所以我编辑了这个
Thread aaa = new Thread() { private final ProgressBar val=null ;//new Thread(pb) ProgressBar val$pb;
public void run() { try {while (this.val.getValue() < 100) { //try added by me
try {
this.val.setValue(this.val.getValue() + 1);
Thread.sleep(10L); } catch (InterruptedException ex) {
}
this.val.repaint(); //draws progress bar as a loading screen before showing home screen
}
}catch(Exception e){
mainForm.homeScreen = new HomeScreen();
mainForm.homeScreen.show(); // draws home screen
}
}
};
aaa.start();
编辑: - 它使用J4ME library。
答案 0 :(得分:1)
如果您的代码已编译,则pb
是Thread
构造函数的参数。
鉴于它是单个参数,它可能是Runnable或String,因为Java ME API仅将这些对象指定为Thread构造函数中的单个参数。
如果我将新线程(pb)更改为新线程(),这段代码将如何?
如果pb是Runnable
,那么事情可能不会改变,因为线程实例aaa
会覆盖run方法(否则会为pb调用),因为在你的代码片段中,没有任何痕迹无论如何调用pb.run
(设计错误的气味或从代码片段中删除的代码太多)。
如果pb是String
,那么线程aaa
的名称将是默认值而不是pb值。
是否会影响val $ pb?
除非您发布更多代码,否则很难说 - 最好是SSCCE形式。
val$pb
看起来很有趣,但这可能是变量的合法标识符,假设在代码段中你已经剪切了初始化它的东西。
更新,假设您已初始化private final ProgressBar val=null
- 因此,在run方法中调用方法的语句将抛出NPE {{1}然后根据代码注释直接进入绘制主屏幕的catch块。
<强> UPDATE2 强>
如果我没有初始化
this.val.getValue()
,那么它会给出private final ProgressBar val
错误,那么初始化它的另一种方法是什么?
您的代码段中的代码数量有限,只能猜测。
想到的一种方法是使用variable val might not have been initialized
初始化,如下所示:
pb
如果pb引用ProgressBar实例并且被声明为final,那么可以编译。
请注意,在这种情况下,//...
new Thread(pb) { private final ProgressBar val$pb = pb; // ...
不是必需的,因为可以使用val$pb
代替它(可能是代码样式首选项引入了此变量)。
另外,鉴于你对j4me的引用必须承认在线程构造函数中使用ProgressBar - 如果pb是这个类的一个实例 - 对我来说没什么意义。人们只能想知道在您发布pb