检查整数值是否增加?

6
我有以下代码,它可以检查数据库中的行数。
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);
    }
}

我希望每秒运行此代码并在值更改时执行某些操作。问题是如何“检测”变化?任何帮助将不胜感激。
4个回答

5

基本上,添加一个类变量 - 你可以把它设置为static跨所有类的实例,或者是一个实例变量(通过删除static关键字)。

每次获取一个数字,你可以将其与oldNumber进行比较。在比较之后,将oldNumber设置为当前数字 - 这样下次就有东西可以进行比较了:

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

更新:

我的答案是一个直接的代码hack & slash解决方案,但我可能会推荐amit的答案


这个方法会一直检查还是只检查一次就结束了? - Zerhinne
@androidnoob 它在每次调用getCount()后进行检查 - 所以是的,每次都会检查。 - Michael
oldNumber = number; 数字无法解析为变量,我需要将其声明为全局变量吗? - Zerhinne
它在条件语句之前的两行声明为 int number = curPdu.getCount();。如果你想在 if (curPdu.moveToNext()){ ... } 之外访问 number,那么你需要改变它的作用域。 - Michael

4

取决于运行的上下文。 假设这个方法所属的对象将在不同的检查之间存在,你所需要做的就是向这个对象添加一个 int currentValue 字段,在第一次检查时先将值存储在其中,然后在随后的检查中将该值与存储在其中的值进行比较(如果必要,则更新)。

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

差不多就是我的答案,只不过你比我早了几秒钟。 :) - Michael

3

不要每秒都检查您的元素是否更改,您可以考虑另一种选择:仅允许特殊访问此元素,并在其更改后执行某些操作。

这是一种众所周知的设计模式,称为观察者模式

这是一种经过充分验证的设计模式,它将使您的代码更易读,并且可能还会提高应用程序的性能和正确性。

编辑:
在Java中,您可以使用Observer接口和Observable类来实现。


2
+1. 这是一个不错的方法,但根据提问者的“新手”程度,写一份简化的说明可能会有所帮助。 - Michael
1
@Mikaveli:我在java.util中的Observer接口和Observable类中添加了链接,我认为在阅读维基页面和这些类的javadoc之后,实现这种模式不应该太难。 - amit

0

你可以为新到来的短信注册一个braodcastreceiver,这样你就会知道变化已经发生了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接