2016-07-05 2 views
0

Итак, я пытаюсь найти калории, сжигаемые для действий с помощью Google Fit, в течение месяца и отображения информации, но это занимает очень много времени (около 45 секунд). То, что я делаю, - это получение всех действий, выполненных пользователем за этот период времени, и создание другого запроса на чтение для калорий, затраченных в течение периода времени для каждого вида деятельности. Я знаю, что это довольно плохой способ сделать это, но я не могу думать ни о каком другом пути.Попытка найти калории, сжигаемые для определенных действий с помощью Google Fit

@Override 
      protected ArrayList<DayActivities> doInBackground(Void... params) 
      { 
       Calendar cal = Calendar.getInstance(); 
       Date now = new Date(); 
       cal.setTime(now); 
       cal.set(Calendar.DAY_OF_MONTH, 30); 
       cal.add(Calendar.MONTH, -1); 
       int currTime; 
       ArrayList<CalorieActivity> activityList = new ArrayList<>(); 

       long endTime = cal.getTimeInMillis(); 
       SetCalendar.setLessOneMonth(cal); 
       long startTime = cal.getTimeInMillis(); 

       DataReadRequest readRequest = ReadRequestFactory.getActivityReadRequest(startTime, endTime); 
       DataReadResult dataReadResult = Fitness.HistoryApi.readData(mClient, readRequest).await(1, TimeUnit.MINUTES); 

       if (dataReadResult.getBuckets().size() > 0) 
       { 
        Log.i("MyApp", "Number of returned buckets of DataSets is: " 
          + dataReadResult.getBuckets().size()); 
        for (Bucket bucket : dataReadResult.getBuckets()) 
        { 
         List<DataSet> dataSets = bucket.getDataSets(); 
         for (DataSet dataSet : dataSets) 
         { 
          Calendar startDate; 
          Calendar endDate; 
          DayActivities currActivity; 
          Date date; 

          for (DataPoint dp : dataSet.getDataPoints()) 
          { 
           startDate = Calendar.getInstance(); 
           endDate = Calendar.getInstance(); 
           currActivity = new DayActivities(); 
           CalorieActivity calorieActivity = new CalorieActivity(); 

           startDate.setTime(new Date(dp.getStartTime(TimeUnit.MILLISECONDS))); 
           currActivity.setStartDate(startDate); 
           calorieActivity.setStartDate(startDate); 
           currTime = startDate.get(Calendar.DAY_OF_MONTH); 
           endDate.setTime(new Date(dp.getEndTime(TimeUnit.MILLISECONDS))); 
           currActivity.setEndDate(endDate); 
           calorieActivity.setEndDate(endDate); 

           for (Field field : dp.getDataType().getFields()) 
           { 
            if (field.getName().equals("activity")) 
            { 
             calorieActivity.setActivity(ActivityTypes.findActivity(Integer.parseInt(dp.getValue(field).toString()))); 
             calorieActivity.setActivityNumber(Integer.parseInt(dp.getValue(field).toString())); 
            } 
           } 

           cal.setTime(calorieActivity.getStartDate().getTime()); 
           startTime = cal.getTimeInMillis(); 
           cal.setTime(calorieActivity.getEndDate().getTime()); 
           endTime = cal.getTimeInMillis(); 

           DataReadRequest readRequest2 = ReadRequestFactory.getCaloriesReadRequest(startTime, endTime); 
           DataReadResult dataReadResult2 = Fitness.HistoryApi.readData(mClient, readRequest2).await(1, TimeUnit.MINUTES); 

           for (Bucket bucket2 : dataReadResult2.getBuckets()) 
           { 
            List<DataSet> dataSets2 = bucket2.getDataSets(); 
            for (DataSet dataSet2 : dataSets2) 
            { 
             for (DataPoint dp2 : dataSet2.getDataPoints()) 
             { 
              for (Field field2 : dp2.getDataType().getFields()) 
              { 
               if (field2.getName().equals("calories")) 
               { 
                calorieActivity.setCalorie((int) Double.parseDouble(dp2.getValue(field2).toString())); 
               } 
              } 
             } 
            } 
           } 


           boolean added = false; 
           for(int j=0; j<dayActivities.size(); j++) 
           { 
            DayActivities currDay = dayActivities.get(j); 
            if(currActivity.getStartDate().get(Calendar.DAY_OF_MONTH) == currDay.getStartDate().get(Calendar.DAY_OF_MONTH)) 
            { 
             currDay.addActivity(calorieActivity); 
             added = true; 
            } 
           } 
           if(!added) 
           { 
            DayActivities newDay = new DayActivities(); 
            Calendar start = Calendar.getInstance(); 
            start.setTime(currActivity.getStartDate().getTime()); 
            Calendar end = Calendar.getInstance(); 
            end.setTime(currActivity.getEndDate().getTime()); 
            SetCalendar.setStartTime(start); 
            SetCalendar.setEndTime(end); 
            newDay.setStartDate(start); 
            newDay.setEndDate(end); 
            newDay.addActivity(calorieActivity); 
            dayActivities.add(newDay); 
           } 
          } 
         } 
        } 
       } 
       else 
       { 
        Log.i("MyApp", "No data"); 
       } 
       Log.i("MyApp", "We're done here"); 
       return dayActivities; 
      } 

Как вы можете видеть, что есть необоснованное количество для петель, это потому, что я должен найти все виды деятельность, которые принимают три для петель, то мне нужно найти сожженные калории для каждого вида деятельности, который (для каждого действия) занимает еще три для циклов. Это смешно, но я не могу найти другого способа сделать это.

+0

Попытайтесь проверить следующие SO-вопросы: [Google Fit API, получая калории, сжигаемые за активность] (http://stackoverflow.com/questions/37820404/google-fit-api-getting-calories-burned-per-activity) и [Расходы калорий с помощью google fit api] (http://stackoverflow.com/questions/32123898/calories-expenditure-using-google-fit-api). Надеюсь, это поможет –

+0

Двое из них мои. Я не смог получить хороший ответ, так как начал работать над этим проектом. Но спасибо за попытку в любом случае :( – user292277

ответ

0

Повторный ответ: я опробовал себя, получая совокупные калории, затраченные на работу за месяц. Во-первых, вот запрос, который я использовал:

new DataReadRequest.Builder() 
     .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED) 
     .bucketByActivitySegment(5, TimeUnit.MINUTES) 
     .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) 
     .build(); 

Это довольно понятно. Я делаю запрос на агрегированные калории, затраченные на одно действие (aggregate и bucketByActivitySegment), установив минимальное время для активности до 5 минут. Диапазон времени установлен на 1 месяц, и он очень быстро возвращает много информации (< 5 секунд, не беспокойтесь о таймауте).

Так что это даст вам калории, затраченные на активность (определяется как минимум 5 минут), и вы можете получить, какой вид деятельности - Bucket.getActivity(), который возвращает строку.

Смежные вопросы