我有一项任务,其中应用使用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分钟。谁知道请帮忙。感谢。
答案 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
}