Eclipse正在提供final
,但我无法增加i
变量。
@Override
public void onClick(View v) {
final TextView tv = (TextView) findViewById(R.id.tvSayac);
int i = 1;
do {
try {
new Thread(new Runnable() {
public void run() {
tv.post(new Runnable() {
public void run() {
tv.setText(Integer.toString(i));
}
});
}
});
i++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (i < 16);
}
答案 0 :(得分:6)
答案 1 :(得分:5)
这里最简单的解决方案是创建一个类:
public class FinalCounter {
private int val;
public FinalCounter(int intialVal) {
val=intialVal;
}
public void increment(){
val++;
}
public void decrement(){
val--;
}
public int getVal(){
return val;
}
public static void main(String[] arg){
final FinalCounter test = new FinalCounter(0);
test.increment(); // 1
test.increment(); // 2
test.increment(); // 3
test.increment(); // 4
test.increment(); // 5
test.decrement(); // 4
System.out.println(test.getVal()); // prints 4
}
}
答案 2 :(得分:1)
我认为可以创建变量i
的本地副本。试试这个:
@Override
public void onClick(View v) {
final TextView tv = (TextView) findViewById(R.id.tvSayac);
int i = 1;
do {
final int localCopy = i; // Create here a final copy of i
try {
new Thread(new Runnable() {
public void run() {
tv.post(new Runnable() {
public void run() {
// use here the copy
tv.setText(Integer.toString(localCopy));
}
});
}
}).start(); // Don't forget to start the Thread!
i++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (i < 16);
}
通过创建最终的本地副本:
i
而不是localCopy
。我想你也想启动Thread ......
编辑:的确,你是对的。您必须在循环内创建本地最终副本。检查新代码。答案 3 :(得分:1)
最终变量只能在定义时才初始化一次。它可以在构造函数中的任何时间设置,但只能设置一次。在你使用i ++递增i的情况下,你试图再次将增加的值分配给i,这是不允许的。
答案 4 :(得分:0)
您可以创建一个计数器类like that并递增它。这样,Counter对象的引用可能是final,但你仍然可以设置它的值吗?
答案 5 :(得分:0)
我做的是添加一个:
private int i;
在此之前:
@Override
public void onClick(View v) {
final TextView tv = (TextView) findViewById(R.id.tvSayac);
i = 1;
do {
try {
new Thread(new Runnable() {
public void run() {
tv.post(new Runnable() {
public void run() {
tv.setText(Integer.toString(i));
}
});
}
});
i++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (i < 16);
}
之后你就可以像往常一样使用你的变量,而不必将其标记为最终变量。