zu finden Ich versuche, die verbrannten Kalorien für Aktivitäten mit Google Fit für einen Monat zu finden und die Informationen anzuzeigen, aber es dauert eine extrem lange Zeit (etwa 45 Sekunden). Ich lese alle Aktivitäten des Benutzers über diesen Zeitraum ab und erstelle eine weitere Leseanforderung für die verbrauchten Kalorien während des Zeitraums für jede Aktivität. Ich weiß, das ist ein ziemlich schlechter Weg, aber ich kann mir keinen anderen Weg vorstellen.Versuchen, die Kalorien für bestimmte Aktivitäten mit 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;
}
Wie Sie eine unzumutbare Anzahl der für Schleifen gibt es sehen können, ist dies, weil ich alle Aktivitäten finden haben, die drei für die Schlingen nimmt, dann muss ich die Kalorien für jede Aktivität verbrannt finden, die (für jede Aktivität) benötigt weitere drei for-Schleifen. Es ist lächerlich, aber ich kann keinen anderen Weg finden, dies zu tun.
Versuchen Sie, folgende SO Fragen zu überprüfen: [Google Fit API, Kalorienverbrauch pro Aktivität] (http://stackoverflow.com/questions/37820404/google-fit-api-getting-cales-burned-per-activity)) und [Kalorienausgaben mit google fit api] (http://stackoverflow.com/questions/32123898/calories-expenditure-using-google-fit-api). Hoffe, das hilft –
Zwei von denen sind meine, eigentlich. Ich habe keine gute Antwort bekommen, seit ich angefangen habe an diesem Projekt zu arbeiten. Aber danke, dass du es trotzdem versucht hast :( – user292277