Итак, я пытаюсь найти калории, сжигаемые для действий с помощью 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;
}
Как вы можете видеть, что есть необоснованное количество для петель, это потому, что я должен найти все виды деятельность, которые принимают три для петель, то мне нужно найти сожженные калории для каждого вида деятельности, который (для каждого действия) занимает еще три для циклов. Это смешно, но я не могу найти другого способа сделать это.
Попытайтесь проверить следующие 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). Надеюсь, это поможет –
Двое из них мои. Я не смог получить хороший ответ, так как начал работать над этим проектом. Но спасибо за попытку в любом случае :( – user292277