Charts: Use database read lock on DBAccess, enable parallel async tasks

This commit is contained in:
José Rebelo
2026-02-10 20:55:40 +00:00
parent 1a8a6447e2
commit 3c92221d96
8 changed files with 26 additions and 19 deletions
@@ -18,6 +18,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -94,7 +95,7 @@ public class ActivitySummariesChartFragment extends AbstractActivityChartFragmen
this.gbDevice = gbDevice;
if (this.view != null) {
setupChart();
createLocalRefreshTask("getting hr and activity", getActivity()).execute();
createLocalRefreshTask("getting hr and activity", getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
@@ -117,7 +118,7 @@ public class ActivitySummariesChartFragment extends AbstractActivityChartFragmen
this.view = view;
if (this.trackFile != null || this.gbDevice != null) {
setupChart();
createLocalRefreshTask("getting hr and activity", getActivity()).execute();
createLocalRefreshTask("getting hr and activity", getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
@@ -218,7 +219,7 @@ public class ActivitySummariesChartFragment extends AbstractActivityChartFragmen
public class RefreshTask extends DBAccess {
public RefreshTask(String task, Context context) {
super(task, context);
super(task, context, false);
}
@Override
@@ -17,6 +17,7 @@
package nodomain.freeyourgadget.gadgetbridge.activities;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -82,7 +83,7 @@ public class BatteryInfoChartFragment extends AbstractGBFragment {
this.gbDevice = gbDevice;
this.batteryIndex = batteryIndex;
try {
createRefreshTask("Visualizing data", getActivity()).execute();
createRefreshTask("Visualizing data", getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} catch (Exception e) {
LOG.debug("Unable to fill charts data right now:", e);
}
@@ -136,7 +137,7 @@ public class BatteryInfoChartFragment extends AbstractGBFragment {
mChart = rootView.findViewById(R.id.activitysleepchart);
if (this.gbDevice != null) {
setupChart();
createRefreshTask("Visualizing data", getActivity()).execute();
createRefreshTask("Visualizing data", getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
return rootView;
}
@@ -213,7 +214,7 @@ public class BatteryInfoChartFragment extends AbstractGBFragment {
public class RefreshTask extends DBAccess {
public RefreshTask(String task, Context context) {
super(task, context);
super(task, context, false);
}
@Override
@@ -23,6 +23,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -77,7 +78,7 @@ public class DevicesFragment extends Fragment {
case DeviceManager.ACTION_DEVICES_CHANGED:
case GBApplication.ACTION_NEW_DATA:
if (action.equals(GBApplication.ACTION_NEW_DATA)) {
createRefreshTask("get activity data", requireContext(), device).execute();
createRefreshTask("get activity data", requireContext(), device).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
if (device != null) {
// Refresh only this device
@@ -129,7 +130,7 @@ public class DevicesFragment extends Fragment {
@Override
public void run() {
if (getContext() != null) {
createRefreshTask("get activity data", getContext(), null).execute();
createRefreshTask("get activity data", getContext(), null).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
});
@@ -242,7 +243,7 @@ public class DevicesFragment extends Fragment {
private final GBDevice device;
public RefreshTask(final String task, final Context context, final GBDevice device) {
super(task, context);
super(task, context, false);
this.device = device;
}
@@ -343,7 +343,7 @@ public abstract class AbstractChartFragment<D extends ChartsData> extends Abstra
if (refreshTask != null && refreshTask.getStatus() != AsyncTask.Status.FINISHED) {
refreshTask.cancel(true);
}
refreshTask = createRefreshTask("Visualizing data", getActivity()).execute();
refreshTask = createRefreshTask("Visualizing data", getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
}
@@ -357,7 +357,7 @@ public abstract class AbstractChartFragment<D extends ChartsData> extends Abstra
private D chartsData;
public RefreshTask(final String task, final Context context) {
super(task, context);
super(task, context, false);
}
@Override
@@ -18,6 +18,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts;
import android.app.DatePickerDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -161,7 +162,7 @@ public class ActivityListingDashboard extends MaterialDialogFragment {
battery_status_time_span_text.setText(text);
battery_status_date_from_text.setText(DateTimeUtils.formatDate(new Date(timeFrom * 1000L)));
battery_status_date_to_text.setText(DateTimeUtils.formatDate(new Date(timeTo * 1000L)));
createRefreshTask("Visualizing step sessions", getActivity()).execute();
createRefreshTask("Visualizing step sessions", getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
@@ -301,7 +302,7 @@ public class ActivityListingDashboard extends MaterialDialogFragment {
public class RefreshTask extends DBAccess {
public RefreshTask(String task, Context context) {
super(task, context);
super(task, context, false);
}
@Override
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcel;
@@ -142,8 +143,8 @@ public class StepStreaksDashboard extends MaterialDialogFragment {
populateData();
}
}
createTaskCalculateLatestStepsStreak("Visualizing data current", getActivity(), PERIOD_CURRENT).execute();
createTaskCalculateLatestStepsStreak("Visualizing data maximum", getActivity(), PERIOD_TOTALS).execute();
createTaskCalculateLatestStepsStreak("Visualizing data current", getActivity(), PERIOD_CURRENT).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
createTaskCalculateLatestStepsStreak("Visualizing data maximum", getActivity(), PERIOD_TOTALS).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
void indicate_progress(boolean inProgress) {
@@ -242,7 +243,7 @@ public class StepStreaksDashboard extends MaterialDialogFragment {
String period;
public TaskCalculateLatestStepsStreak(String taskName, Context context, String period) {
super(taskName, context);
super(taskName, context, false);
this.period = period;
}
@@ -35,10 +35,12 @@ public abstract class DBAccess extends AsyncTask {
private final String mTask;
private final Context mContext;
private Exception mError;
private final boolean mForWrite;
public DBAccess(String task, Context context) {
public DBAccess(String task, Context context, boolean forWrite) {
mTask = task;
mContext = context;
mForWrite = forWrite;
}
public Context getContext() {
@@ -49,7 +51,7 @@ public abstract class DBAccess extends AsyncTask {
@Override
protected Object doInBackground(Object[] params) {
try (DBHandler db = GBApplication.acquireDB()) {
try (DBHandler db = (mForWrite ? GBApplication.acquireDB() : GBApplication.acquireDbReadOnly())) {
doInBackground(db);
} catch (Exception e) {
LOG.error("Error during DBAccess for {}", mTask, e);
@@ -144,7 +144,7 @@ public class GBDeviceEventBatteryInfo extends GBDeviceEvent {
GBDevice gbDevice;
public StoreDataTask(String task, Context context, GBDevice device, GBDeviceEventBatteryInfo deviceEvent) {
super(task, context);
super(task, context, true);
this.deviceEvent = deviceEvent;
this.gbDevice = device;
}