¿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); }
- Haz que la aplicación para Android escute los enlaces compartidos
- ¿Cómo se puede forzar una descarga en un objeto OutputStream sin cerrarlo?
- Sonido que no juega en android> sándwich de helado
- La selección de proyectos en configuraciones de ejecución en Eclipse está vacía
- Utilizar Linkify.addLinks combinar con Html.fromHtml
- La reproducción de una canción tras otra provoca un error en MP3Extractor
- Cómo leer los contactos y los contactos del teléfono móvil de Android por separado
- Canny detector de borde para Android - StackOverflow en función recursiva
- Android OverlayItem.setMarker (): Cambia el marcador de un elemento
- Ajuste del tamaño de los botones en porcentaje
- Android.content.res.Resources $ NotFoundException: Cadena de recursos ID # 0x0
- ¿Es String una primitiva o un Objeto en Android o Java?
- Cómo leer las propiedades de Android con Java
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 nolocalCopy
.
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.
- El navegador nativo de Android no actualiza la altura en el desbordamiento automático al agregar elementos
- Borde de la imagen transparente en Android