30/09/2018, 17:40
Tại sao trong Android phải khai báo final cho biến local khi truy cập từ inner class?
Em có code đếm thời gian như thế này
public void onClickStart(View view) {
final TextView tvTime = (TextView) findViewById(R.id.tvTime);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
int hour = seconds / 3600;
int minute = (seconds % 3600) / 60;
int second = seconds % 3600;
String time = String.format("%d:%02d:%02d", hour, minute, second);
tvTime.setText(time);
seconds++;
handler.postDelayed(this, 1000);
}
});
}
Nếu bỏ final ở dòng final TextView tvTime = (TextView) findViewById(R.id.tvTime);
thì sẽ bị báo lỗi local variable tvTime is accessed from within inner class; needs to be declared final
ở dòng tvTime.setText(time);
. Nhưng nếu em đưa tvTime
ra ngoài làm biến Global thì lại không cần final nữa
Bài liên quan
Class mà bạn nói nó không phải là inner class mà là class vô danh (anonymous).
Đại loại là các biến sử dụng trong anonymous đều sẽ bị làm sạch (xóa bỏ) khi kết thúc, vì vậy sẽ nguy hiểm khi dùng biến không final trong này do có thể làm phá huỷ, thay đổi nó.
Bạn đọc thêm ở đây:
Cannot refer to a non-final variable inside an inner class defined in a different method