【问题标题】:How to reset count for every half an hour based on date and time android?如何根据日期和时间android每半小时重置一次计数?
【发布时间】:2016-04-28 09:28:18
【问题描述】:

我正在使用信标类型,我需要每半小时重置一次计数。当设备被触发时,我将在 db 中插入相应日期和时间以及计数器的数据。但是到了半小时后,需要将计数器从1重新设置。如何处理?

这是我尝试过的代码。

此数据库方法将在服务类中调用..

 if(Application.getPrefString(BluetoothLeService.this,Application.ACTIVITY_LOGGING_ON).equalsIgnoreCase(getString(R.string.activity_logging_on))) {
     if(GattConstant.CHAR_ACTIVITY_NOTIFY.equals(characteristic.getUuid())) {
          Log.e("logging on", "logging on");
          dbHelper.insertTestHistory();
     }
}

数据库助手:

 private int activityCounts=0;

  public void insertTestHistory() {
    synchronized (lock) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.getDefault());
        String date = dateFormat.format(new Date());
        previousDate = date;
        Log.e("activitycount", activityCounts + " " + date);
        activityCounts++;
                SQLiteDatabase database = this.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(Application.ACTIVITY_LOG_STATUS, previousDate + ",activity," + (activityCounts));
                database.insert(Application.ACTIVITY_LOG_TABLE, null, values);
                database.close();
            }
        }

    public List<String> getActivityHistory() {
    synchronized (lock) {
        List<String> deviceHistoryLog = new ArrayList<String>();
        String selectQuery = "SELECT *  FROM " + Application.ACTIVITY_LOG_TABLE + " ORDER BY ROWID DESC";
        SQLiteDatabase database = this.getWritableDatabase();
        Cursor cursor = database.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                deviceHistoryLog.add(cursor.getString(cursor.getColumnIndex(Application.ACTIVITY_LOG_STATUS)));
            } while (cursor.moveToNext());
        }
        // Close cursor and database.
        cursor.close();
        database.close();
        return deviceHistoryLog;
    }
}


  in MainActivity:

public class MainActivity extends Activity{
   Da
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tracking);
    dbHelper = DatabaseHelper.getInstance(this);
    deviceHistory = dbHelper.getActivityHistory();
    if (deviceHistory.size() == 0) {
        Log.e("empty", "empty");
    } else {
        for (int i = 0; i < deviceHistory.size(); i++) {
            historyContent += deviceHistory.get(i);
            historyData = deviceHistory.get(i);
            Log.e("historydata", historyContent);
        }
    }
}

我得到的数据是:

04-28 14:41:32.730 30076-30091/com.test E/activitycount: 1 04/28/2016 14:41:32
04-28 14:41:33.861 30076-30091/com.test E/logging on: logging on
04-28 14:41:33.863 30076-30091/com.test E/activitycount: 2 04/28/2016 14:41:33
04-28 14:41:33.879 30076-30091/com.test E/logging on: logging on
04-28 14:41:33.881 30076-30091/com.test E/activitycount: 3 04/28/2016 14:41:33
04-28 14:41:33.895 30076-30091/com.test E/logging on: logging on
04-28 14:41:33.896 30076-30091/com.test E/activitycount: 4 04/28/2016 14:41:33

当它到达 15:01 时我需要重置,即当它触发时活动记录为 1.. 然后 15.02 为 2 以此类推,每半小时,计数器重置一次。

【问题讨论】:

    标签: android mysql database android-sqlite android-database


    【解决方案1】:

    你可以使用AlarmManager

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent notifyintent = new Intent(this, NotificationBroadcast.class);
    pIntent = PendingIntent.getBroadcast(this, 0, notifyintent, 0);
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    //update 30 seconds
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),1*30*1000, pIntent);
    

    并使用广播接收器更新计数

    public class NotificationBroadcast extends BroadcastReceiver {  
    
        @Override
        public void onReceive(final Context context, final Intent intent) {
           ....
       }
    }
    

    【讨论】:

    • 我需要重置计数器。计数与 alarmManager 的关系在哪里?
    • 刚启动计时器,30分钟后会自动重置activityCounts,如果需要可以更改时间
    • 接收器类每隔 30 分钟调用一次。您可以重置为 0。
    【解决方案2】:

    1。以毫秒为单位维护上次重置时间的类级别字段

    long lastResetTimeInMilliSecs = new Date ().getTime() / 1000;

    1. 制作一个计时器以在 30 分钟后重置 activityCounts

      public void startResetTimer() {
        new Timer ().schedule (new TimerTask () {
         @Override
         public void run () {
      
          ((BaseActivity) context).runOnUiThread (new Runnable () {
              @Override
              public void run () {
      
                  try {
                      long differenceInSeconds = (new Date().getTime() - lastResetTime) / 1000;  //divide by 1000 to get time in seconds
                      if(differenceInSeconds >= 30 * 60 * differenceInSeconds) {  //30 mins = hours (multiple by 60 to convert into minutes) = 30minutes
                          //resetCounter;
                          activityCounts = 0;
                          //update last reset time 
                          lastResetTime = new Date ().getTime();
                      }
                  }
                  catch (Exception e) {
                      e.printStackTrace ();
                  }
              }
          });
      }
      
      }, 0, 1000);
      

      }

    2. 你的方法是这样的,不要把定时器逻辑和这个方法混在一起

      public void insertTestHistory() {
       synchronized (lock) {
       SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.getDefault());
       String date = dateFormat.format(new Date());
       previousDate = date;
       Log.e("activitycount", activityCounts + " " + date);
       activityCounts++;
      
        SQLiteDatabase database = this.getWritableDatabase();
          ContentValues values = new ContentValues();
          values.put(VALRTApplication.ACTIVITY_LOG_STATUS, previousDate + ",activity," + (activityCounts));
          database.insert(VALRTApplication.ACTIVITY_LOG_TABLE, null, values);
          database.close();
        }
      }
      
    3. 只启动一次定时器,即调用一次startResetTimer方法,无需每次调用​​insertTestHistory时调用

    【讨论】:

    • 那么我需要在哪里使用它?当我调用方法 insertTestHistory() 时?
    • 此代码在 30 分钟后重置计数器,现在由您决定如何使用。你最好知道它在哪里需要。
    • 它的类型是long或int。
    • 刚启动计时器,30分钟后会自动重置activityCounts,如果需要可以更改时间
    • 好吧,让我尝试使用insertHistory方法的数据库助手
    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多