如何检测android中未更改的ArrayList内容?

时间:2015-08-04 04:54:02

标签: java android arraylist

我有一项任务,其中应用使用LatLng检测到LocationListener,并且每两分钟添加ArrayList。如果ArrayList大小达到6,则将内容发送到SMS并清除ArrayList的项目。如果设备仅移动,它仅检测LatLng。如果移动设备在向ArrayList添加六个元素之前停止,那么它就不完整了。如果ArrayList大小达到6,我使用以下代码发送SMS。

 private void sendLog() {

    Toast.makeText(MainPage.this,"Sending Log",Toast.LENGTH_LONG).show();
    final SharedPreferences account=getSharedPreferences("admins",MODE_PRIVATE);
    String interval=account.getString("lti", "");
    int timeInterval=Integer.parseInt(interval);

    final List<String> loglist = new ArrayList<String>();
    LocationManager logManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
    logManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, timeInterval*60000, 250, new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            double latitude=location.getLatitude();
            double longitude=location.getLongitude();
            DecimalFormat dFormat = new DecimalFormat("#.####");
            Date date=new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("kk:mm");
            SimpleDateFormat sdf1=new SimpleDateFormat("dd-MM,yy");
            String time=sdf.format(date);
            final String dateLog=sdf1.format(date);

            loglist.add("!+" + dFormat.format(latitude) + ",+" + dFormat.format(longitude) + "," + time);

            if (loglist.size()==6) {
                log = new StringBuilder();
                for (int j = 0; j < loglist.size(); j++) {
                    log.append(loglist.get(j).toString());
                }
                SmsManager smsManager=SmsManager.getDefault();
                smsManager.sendTextMessage(logPreferences.getString("admin1", ""), null,"  "+ log.toString()+"!"+dateLog+"!", null, null);
                loglist.removeAll(loglist);
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    });
}

我的问题是如果ArrayList的内容在接下来的二十分钟内没有改变,我必须将不完整的ArrayList发送给SMS。现在如何检测ArrayList的内容没有改变20分钟。谁知道请帮忙。感谢。

3 个答案:

答案 0 :(得分:0)

创建备份类型的ArrayList变量。并且每20分钟将其内容与 ArrayList 进行比较。使用以下内容进行比较。

ArrayList commonList = CollectionUtils.retainAll(backuplist,yourlist);
if (commanList.size()==yourlist){
    //Send SMS because, this block is executed when no item is changed
}

要每20分钟执行一次,您必须使用单独的线程。像Handler类一样使用,或按照here所述使用AlarmManager。

答案 1 :(得分:0)

您可以使用倒计时器和bool值。

bool isUpdated = true;

countDownTimer = new CountDownTimer(20*60*100, 20*60*100) {
    @Override public void onTick(long millisUntilFinished) {
}

    public void onFinish() {
     isUpdated = false;
   }

使用:

countDownTimer.cancel();
countDownTimer.start();

在阵列更改时启动和停止计时器。

然后在发送短信时测试bool值。

if(isUpdated==true){
    // Your TODO
}
else{
    // No change.
}

重置计时器时,不要忘记重置bool值。

答案 2 :(得分:0)

为什么不通过定义以下方法来简化代码:

//your class's fields
private List<String> loglist;
private Handler handler;
private Runnable sendSmsRunnable;


/**
* Call this method to initialise the timed run (after 20 minutes)
*/
private void set20MinuteTimedRunnable() {
    sendSmsRunnable = new Runnable() {
        @Override
        public void run() {
            sendSms();
        }
    };
    handler = new Handler();
    handler.postDelayed(sendSmsRunnable, 20 * 1000);
}

/**
* This will append location and if it reaches threshold
* (i.e size = 6), then it will call sendSms().
*/
private void appendLocation (String location) {
    logList.add(location);
    if(logList.size() == 6) {
        sendSms();
    }
}

/**
* sends SMS and removes the timed runnable
*/
private void sendSms () {
    handler.removeCallbacks(sendSmsRunnable);
    //send the sms here
}