2011-09-01 14 views
5

Tengo el siguiente código, que comprueba el número de filas en la base de datos.Verifica si el valor entero ha aumentado?

private void checkMMSRows(){ 
    Cursor curPdu = getContentResolver().query(Uri.parse("content://mms/part"), null, null, null, null); 
    if (curPdu.moveToNext()){ 
     int number = curPdu.getCount(); 
     System.out.println(number); 
    } 
} 

Ejecutaré este código cada segundo y haré algo cuando el valor haya cambiado. El problema es, ¿cómo hago para "detectar" el cambio? Cualquier ayuda sería apreciada.

Respuesta

4

Muy básicamente, añadir una variable de clase - usted puede hacer que sea static en todas las instancias de la clase, o una variable de instancia (mediante la eliminación de la palabra clave static).

Cada vez que obtenga un número, puede compararlo al oldNumber. Después de la comparación, establecer el oldNumber al número actual - por lo que tiene algo para comparar contra la próxima vez:

private static int oldNumber = -1; 
private void checkMMSRows(){ 
    Cursor curPdu = getContentResolver().query(Uri.parse("content://mms/part"), null, null, null, null); 
    if (curPdu.moveToNext()){ 
     int number = curPdu.getCount(); 
     System.out.println(number); 
     if(number != oldNumber){ 
      System.out.println("Changed"); 
      // add any code here that you want to react to the change 
     } 
     oldNumber = number; 
    } 
} 

Actualización:

Mi respuesta es una solución recta código de truco & barra, pero probablemente recomendaría amit's answer.

+0

¿El método sigue controlando o solo revisa una vez y listo? – androidnoob

+0

@androidnoob Comprueba cada vez que llamas a 'getCount()' - así que sí, cada vez. – Mikaveli

+0

'oldNumber = number;' el número no se puede resolver en una variable, ¿debo declararlo como una variable global? – androidnoob

4

Depende del contexto en el que se ejecuta. Suponiendo que el objeto al que pertenece este método vivirá entre diferentes comprobaciones, todo lo que necesita hacer es agregar un campo int currentValue al objeto, almacenar el valor allí la primera vez que lo compruebe y luego comparar el valor con el almacenado los de controles posteriores (y actualización si es necesario)

int currentValue = 0; 
private void checkMMSRows(){ 
    Cursor curPdu = getContentResolver().query(Uri.parse("content://mms/part"), null, null, null, null); 
    if (curPdu.moveToNext()){ 
     int newValue = curPdu.getCount(); 
     if (newvalue != currentValue) { 
       //detected a change 
       currentValue = newValue; 
     } 
     System.out.println(newValue); 
    } 
} 
+0

+1. Más o menos mi respuesta, pero llegaste unos segundos antes. :) – Mikaveli

0

puede regsister un braodcastreceiver para los nuevos MMS próximos y de esta manera se llega a saber que el cambio ha tenido lugar ..

3

En lugar de comprobar cada segundo si se ha cambiado el elemento, es posible que desee considerar una alternativa: permita solo acceso especial a este elemento, y haga algo una vez que se cambie.

Este es un patrón de diseño bien conocido y se llama Observer Pattern.

Este es un patrón de diseño bien probado, que hará que su código sea más legible, y probablemente también mejore el rendimiento y la corrección de su aplicación.

EDIT:
en Java, puede utilizar la interfaz Observer y Observable clase con el fin de hacerlo.

+2

+1. Buen enfoque, pero puede ayudar a escribir una explicación simplificada, dependiendo de cuán 'novato' sea el OP. – Mikaveli

+1

@Mikaveli: Agregué enlaces a la interfaz Observer y la clase Observable en java.util, y creo que después de leer la página wiki, y los javadocs para estas clases, la implementación de este patrón no debería ser demasiado difícil. – amit

Cuestiones relacionadas