Android Thread Execution Slows Down when screen locks

654 Views Asked by At

Iam running this procedure to download some data and insert them into the database. The total procedure takes around 5 minutes. I noticed that while downloading, when the phone locks the screen and open it after 5 minutes, it will still downloading. It seems when locked download procedure slows down. Is there any explanation?

The execution time also slows down when pressing home button and becomes a background process, not only when sreen locks.

Thank you

public abstract class AppDatabase extends RoomDatabase {

private static AppDatabase sInstance;

@VisibleForTesting
public static final String DATABASE_NAME = "Database_db";

public abstract CustomerDao repoCustomer();


public static AppDatabase getInstance(Context context) {

    if (sInstance == null) {
        synchronized (AppDatabase.class) {
            if (sInstance == null) {
                sInstance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME).build();

            }
        }
    }
    return sInstance;
}


public void downloadCustomers(final String table){

        executors.diskIO().execute(new Runnable() {
            @Override
            public void run() {
               //download data and insert into database.
             });
        }  
}
1

There are 1 best solutions below

5
On

I believe it is something related with power management. Have you tried using a wake lock?

To test if that is your problem, simply add android:keepScreenOn="true" to the layout of the activity where the thread is started.

If it solves the problem and you don´t need the screen on, consider reading this thread:

https://developer.android.com/training/scheduling/wakelock

To aquire a wakelock you must add this to your manifest:

<uses-permission android:name="android.permission.WAKE_LOCK" />

And set manually the wake lock:

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
            acquire()
        }
    }

To manually release it, you can do it with:

wakelock.release()

Also, from the same source and it seems to me that this can be applied to your problem, check this out:

Before adding wakelock support to your app, consider whether your app's use cases support one of the following alternative solutions:

"If your app is performing long-running HTTP downloads, consider using DownloadManager. If your app is synchronizing data from an external server, consider creating a sync adapter. If your app relies on background services, consider using JobScheduler or Firebase Cloud Messaging to trigger these services at specific intervals."

Hope it helps.