¿Cómo puedo aumentar la variable entera final?

Eclipse está ofreciendo final pero no puedo aumentar la variable 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); } 

introduzca la descripción de la imagen aquí

Una final es una entidad que no se puede cambiar después de que se inicialice.

Final (Java)

Lo que podría hacer es crear una variable dentro del alcance del bucle do / while que es final con el valor de i y enviarlo a la función.

La solución más fácil aquí es crear una clase:

 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 } } 

Una variable final sólo se puede inicializar una vez no necesariamente cuando se está definiendo. Se puede establecer en cualquier momento dentro del constructor, pero sólo una vez. En su caso, cuando está incrementando i usando i ++, está intentando asignar el valor incrementado a i de nuevo que no está permitido.

Creo que es posible crear una copia local de la variable i . Prueba esto:

 @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); } 

Al crear una copia local final:

  • el compilador no se quejará más
  • debido a las copias Java por valor, sólo aumentará i y no localCopy .

Supongo que quieres iniciar el hilo también …

EDIT: De hecho, tenías razón. Debe crear la copia final local dentro del bucle. Compruebe el nuevo código.

Podrías crear una clase de contador así e incrementarla. De esta manera, la referencia del objeto Counter podría ser definitiva, pero todavía podría establecer su valor?

Lo que hice fue añadir un:

 private int i; 

Antes de esto:

 @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); } 

Y usted podrá utilizar su variable como de costumbre después de eso, sin tener que marcarlo como final.

  • Añadir scroll en tabhost en android
  • La realización de una exploración UPNP no devuelve el puente Philips Hue
  • Reemplazar cadenas en una cadena larga:
  • Android: cajón de navegación sin xml
  • Ver si existe un campo en la clase
  • ¿Qué significa que un método esté obsoleto y cómo puedo resolver los errores resultantes?
  • adb no puede encontrar mi dispositivo para la depuración de Android. ¿Por qué?
  • Inyección de dependencia de Java: Dagger 1 vs Dagger 2, que es mejor?
  • Cómo escuchar una copia en Android
  • Socket Android + ObjectOutputStream no funciona correctamente
  • Obtener la dirección IP del dispositivo Android cuando está conectado a una red móvil 3G
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.