¿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.

  • Utilizar Bouncy Castle para extraer información de certificados de android
  • Abrir URL en webView en android
  • Cuando se procesa una cadena csv con un campo final vacío, myString.split (",") devuelve un número incorrecto de entradas de matriz
  • Crash con Android 4.1 con ArrayMap
  • Enviar correo automáticamente en fondo en Android
  • Tamaños desplegables para diferentes tamaños de pantalla en android
  • El diálogo de carga de la vista Web de Android no se ha descartado
  • Cómo convertir la longitud de la latitud en formato de grado
  • Dalvik VM error: Excepción encontrada "Javax.xml.namespace.QName.class"
  • Tiene "versión de archivo de clase no compatible 52.0" después de incluir un módulo en un proyecto
  • Crashlytics no encuentra clave API en crashlytics.properties en tiempo de ejecución
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.