2016-07-05 4 views
0

Google Fitを使用して1ヶ月間のカロリーを消費して情報を表示していますが、非常に長い時間がかかります(約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; 
      } 

あなたは、ループのための不合理な数があります見ることができるように、これは(私はループのための3つを取るすべての活動を、見つける必要があるので、私はそれぞれの活動のために消費カロリーを見つける必要があるこれは各アクティビティに対して)ループ用にさらに3つが必要です。ばかばかしいですが、私はこれを行う他の方法を見つけることができません。

+0

[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

2つは実際に私のものです。私はこのプロジェクトに取り組み始めて以来、良い答えを得ることができませんでした。とにかく試していただきありがとうございます:( – user292277

答えて

0

私の答えをやり直して:1カ月間の活動のために消費された総カロリーを自分で試してみました。まず、私が使用したリクエストは次のとおりです。

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分で定義されます)ごとに消費されるカロリーを与え、によってどのようなタイプのアクティビティが得られるかを文字列で返します。

関連する問題