2016-07-05 5 views
0

Google Fit을 사용하여 한 달 동안 열량을 계산하고 정보를 표시하는 활동에 소모 된 칼로리를 찾으려고하는데 매우 오랜 시간이 걸립니다 (약 45 초). 내가하고있는 일은 그 기간 동안 사용자가 수행 한 모든 활동을 검색하고 각 활동의 기간 동안 소비 된 칼로리에 대한 또 다른 읽기 요청을 작성하는 것입니다. 나는 이것이 이것을하는 아주 나쁜 방법이라는 것을 알고 있지만, 나는 다른 어떤 생각을 할 수 없다. 당신이 for 루프의 불합리한 수가있다 볼 수 있듯이 내가 루프에 대한 세, 그때 각 활동 (위해 불에 칼로리를 찾을 필요합니다 모든 활동을 발견해야하기 때문에Google 피트니스로 특정 활동에 소모 된 칼로리를 찾으려고 시도

@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

[Google 피트니스 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(); 

꽤 자명합니다. 나는 활동 당 소비 된 총 칼로리 (aggregatebucketByActivitySegment)를 요청하여 활동의 최소 시간을 5 분으로 설정합니다. 시간 범위는 1 개월 동안 설정되며 많은 정보가 매우 빨리 반환됩니다 (< 5 초, 시간 초과에 대한 걱정 없음).

이렇게하면 활동 당 소모 된 칼로리 (최소 5 분으로 정의 됨)가 제공되고 어떤 유형의 활동인지 알 수 있습니다 (Bucket.getActivity()). 이는 문자열을 반환합니다.