屏幕锁定时 Android 线程执行速度变慢

标签 android runnable executorservice executor android-thread

我正在运行此过程以下载一些数据并将它们插入数据库。整个过程大约需要 5 分钟。我注意到下载的时候,手机锁屏5分钟后打开,还是会下载。似乎锁定的下载过程变慢了。有什么解释吗?

不仅在屏幕锁定时,按下主页按钮并成为后台进程时,执行时间也会变慢。

谢谢

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.
             });
        }  
}

最佳答案

我认为这与电源管理有关。您是否尝试过使用唤醒锁?

要测试这是否是您的问题,只需将 android:keepScreenOn="true"添加到启动线程的 Activity 的布局中即可。

如果它解决了问题并且您不需要打开屏幕,请考虑阅读此主题:

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

要获取唤醒锁,您必须将其添加到您的 list 中:

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

并手动设置唤醒锁:

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

要手动释放它,你可以这样做:

wakelock.release()

此外,来自同一来源,在我看来这可以应用于您的问题,请查看:

在为您的应用添加唤醒锁支持之前,请考虑您的应用的用例是否支持以下替代解决方案之一:

“如果您的应用正在执行长时间运行的 HTTP 下载,请考虑使用 DownloadManager。 如果您的应用正在从外部服务器同步数据,请考虑创建一个同步适配器。 如果您的应用依赖后台服务,请考虑使用 JobScheduler 或 Firebase Cloud Messaging 以特定时间间隔触发这些服务。”

希望对您有所帮助。

关于屏幕锁定时 Android 线程执行速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52315308/

相关文章:

java - 没有得到响应 Volley android

Android - 使用 Google Scoped Storage API 访问 native C/C++ 代码中的文件

android - 将 long 转换为 Double 时遇到问题

java - 如何动态改变重复Java Runnable的周期?

java - 为什么抽象属性在 Runnable 接口(interface)的子类中丢失?

android - 是否可以以编程方式添加和配置交换帐户

Java-异常处理

java - 如何从 map 中获取数据?

java - ExecutorService 令人惊讶的性能盈亏平衡点——经验法则?

Java: ExecutorService with Callables: Timeout: future.get() 导致直接中断程序