标签: android-workmanager

WorkManager:立即调用 doWork() 进行测试

如果我有一个PeriodicWorkRequest我可以设置一个时间间隔 - 最小是 15 分钟。但是如何doWork()在不等待 15 分钟的情况下测试我的方法是否有效?

是否可以OneTimeWorkRequest用于测试目的?

提前致谢

android android-architecture-components android-workmanager

6
推荐指数
1
解决办法
1542
查看次数

使用 WorkManager 下载文件

我正在/尝试使用 WorkManager 和 MVVM 下载具有暂停和恢复功能的文件。

在这里,我正在使用 WorkManager 寻求暂停/恢复和下载百分比进度更新。所以我在这里分享我的课程。

MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var downloadViewModel : DownloaderViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_main)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this,R.layout.activity_main)
        downloadViewModel = ViewModelProviders.of(this).get(DownloaderViewModel::class.java)
        binding.viewmodel = downloadViewModel
        download_button.setOnClickListener({
                startDownload()
        })

        cancel_button.setOnClickListener({
            downloadViewModel.cancelDownloadWork(Constants.TAG_OUTPUT)
            WorkUtils.deleteFile(WorkUtils.getIsbn(Constants.TAG_OUTPUT))
        })

        downloadViewModel.mSavedWorkStatus.observe(this, Observer {

            it?.let {

            }
            if(it?.size!! > 0){
                val workStatus = it.first()
                val workState =  workStatus?.state
                downloadViewModel.updateDownloadWorkState(workState.toString())
                WorkUtils.makeStatusNotification(workState.toString(),this.applicationContext)
            }
        })

        pause_button.setOnClickListener({
            downloadViewModel.cancelDownloadWork(Constants.TAG_OUTPUT)
            val pausedAt = WorkUtils.getFileSize(WorkUtils.getIsbn(DOWNLOAD_URL))
            Log.d("paused at","paused at $pausedAt")
        })

        resume_button.setOnClickListener({
            val resumeFrom = WorkUtils.getFileSize(WorkUtils.getIsbn(DOWNLOAD_URL)) …
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-workmanager

6
推荐指数
1
解决办法
7040
查看次数

如何在 Android 中从 WorkManager 获取实时数据


我正在尝试从WorkManagerdoWork()的方法进行 API 调用。我收到了一份回复清单。如何将这个复杂对象设置为 WorkManager 的输出?MutableLiveData

请在下面找到相同的实现:

class FetchWorkManager(context: Context, params: WorkerParameters): Worker(context, params) {
    var postInfoLiveData: LiveData<List<PostInfo>> = MutableLiveData()

    @SuppressLint("RestrictedApi")
    override fun doWork(): Result {
        fetchInfoFromRepository()
        // Setting output data
        val data = Data.Builder()
            .putAll(postInfoLiveData)
            //.put("liveData", postInfoLiveData)
            .build()
        return Result.success(data)
    }


    fun fetchInfoFromRepository() {
        val retrofitRepository = RetrofitRepository()
        postInfoLiveData = retrofitRepository.fetchPostInfoList()
    }
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决这个问题?

android kotlin android-livedata android-jetpack android-workmanager

6
推荐指数
1
解决办法
9602
查看次数

WorkManager 在工作完成后保留通知

我想在工作人员在后台运行时显示通知。我可以用下面的代码来做到这一点:

override suspend fun doWork(): Result {
    val manager = NotificationManagerCompat.from(applicationContext)
    val channel = "some_channel"
    val id = 15
    val builder = NotificationCompat.Builder(applicationContext, channel)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        manager.createNotificationChannel(NotificationChannel(channel, "DefaultName", NotificationManager.IMPORTANCE_LOW))

    builder
        .setOnlyAlertOnce(true)
        .setOngoing(true)
        .setAutoCancel(false)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setSmallIcon(android.R.drawable.ic_dialog_alert)
        .setTicker("Background Task")
        .setContentText("Starting")
        .setProgress(0, 0, true)

    setForeground(ForegroundInfo(id, builder.build()))

    delay(500)

    manager.notify(id, builder.setContentText("Progress A").setProgress(20, 0, false).build())
    for (i in 1..20) {
        delay(100)
        manager.notify(id, builder.setProgress(20, i, false).build())
    }

    delay(500)

    manager.notify(id, builder.setContentText("Progress B").setProgress(2, 0, false).build())
    delay(1000)
    manager.notify(id, builder.setProgress(2, 1, false).build())
    delay(1000)
    manager.notify(id, builder.setProgress(2, 2, false).build())

    delay(1000)

    manager.notify(id, …
Run Code Online (Sandbox Code Playgroud)

android android-notifications android-workmanager

6
推荐指数
1
解决办法
2838
查看次数

WorkManager 尝试在 Application#onCreate 中排队独特的定期工作时崩溃

我想将 WorkManager 与 Dagger 2 一起使用,将依赖项注入到工作人员中。我按照这篇文章来实现设置。设置部分是按需初始化。为了实现它,我将以下行添加到我的清单文件中:

\n\n
    <provider\n        android:name="androidx.work.impl.WorkManagerInitializer"\n        android:authorities="${applicationId}.workmanager-init"\n        android:exported="false"\n        tools:node="remove" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

并使我的应用程序类实现Configuration.Provider如下接口:

\n\n
    @NonNull\n    @Override\n    public Configuration getWorkManagerConfiguration() {\n        return new Configuration.Builder().setMinimumLoggingLevel(Log.DEBUG).setWorkerFactory(delegatingWorkerFactory).build();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dagger 设置按预期工作。

\n\n

但是我遇到了以下问题:在Application#onCreate我将唯一的定期任务排入队列并在第一次安装应用程序时,此操作总是失败并出现以下错误:

\n\n
java.lang.IllegalStateException: The file system on the device is in a bad state. WorkManager cannot access the app\'s internal data store.\n    at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:115)\n    at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)\n    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)\n    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)\n    at java.lang.Thread.run(Thread.java:764)\n Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database\n …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

6
推荐指数
1
解决办法
4427
查看次数

即使 WorkManagerInitializer 未在清单中禁用,WorkManager 未初始化异常

我有一个用于WorkManager多个后台任务的应用程序。最近,即使我没有在清单中禁用,由于 WM 未初始化,我在生产日志中看到很多崩溃WorkManagerInitializer

java.lang.IllegalStateException: WorkManager is not initialized properly. The most likely cause is that you disabled WorkManagerInitializer in your manifest but forgot to call WorkManager#initialize in your Application#onCreate or a ContentProvider.
        at androidx.work.WorkManager.getInstance(WorkManager:161)
        ...
Run Code Online (Sandbox Code Playgroud)

WM 文档说

默认情况下,WorkManager 使用内置 ContentProvider 自动初始化自身。ContentProviders 在 Application 对象之前创建和运行,因此在大多数情况下,这允许在代码运行之前设置 WorkManager 单例。

在大多数情况下,有趣的部分是。我想知道在什么情况下它在应用程序启动之前没有正确初始化。

我最初的猜测是我的代码中的错误可能创建了太多的 WM 任务,这些任务需要很长时间才能初始化,但我无法以这种方式重新创建崩溃。

有人以前见过这种行为并且知道这里会发生什么吗?为什么WorkManager应用程序启动前没有初始化?

android android-workmanager

6
推荐指数
1
解决办法
1096
查看次数

WorkManager自定义初始化抱怨WorkManager#initialize

与:实现“androidx.work:work-runtime:2.3.4”

我正在尝试实现自定义初始化,以根据这些说明启用更详细的日志记录。

第一个片段有一行 bad: return Configuration.Builder()need to be return new Configuration.Builder()

我扩展了应用程序,如下所示:

class MyApplication extends Application implements Configuration.Provider {
    @Override
    public Configuration getWorkManagerConfiguration() {
        return new Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.INFO)
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

我像这样启动工人:

WorkManager.getInstance(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

但即使在这一切之后,我还是让应用程序因以下投诉而崩溃:

WorkManager 未正确初始化。您已在清单中显式禁用 WorkManagerInitializer,此时尚未手动调用 WorkManager#initialize,并且您的应用程序未实现 Configuration.Provider。

尽管说明指出:

您不需要自己调用 WorkManager.initialize()

java android android-workmanager

6
推荐指数
2
解决办法
1万
查看次数

使用 Workmanager 进行 Hilt Instrumentation 测试无法正常工作

当我尝试在包含 WorkManager 的应用程序中运行 ActivityScenario 时,我在启动时收到以下错误:

java.lang.IllegalStateException: WorkManager is not initialized properly.  You have explicitly disabled WorkManagerInitializer in your manifest, have not manually called WorkManager#initialize at this point, and your Application does not implement Configuration.Provider.
Run Code Online (Sandbox Code Playgroud)

使用工件WorkManagerTestInitHelper中的work-test也没有帮助。

WorkManager 的定义如下:

@Provides
@Singleton
fun provideWorkmanager(@ApplicationContext context: Context) = WorkManager.getInstance(context)
Run Code Online (Sandbox Code Playgroud)

这是我的测试自动取款机:

    @HiltAndroidTest
    @RunWith(AndroidJUnit4::class)
    class LoginTest {
    
        @get:Rule(order = 0)
        var hiltRule = HiltAndroidRule(this)
    
        @get:Rule(order = 1)
        val activityRule = ActivityScenarioRule(MainActivity::class.java)
    
        @Before
        fun before() {
            val context = InstrumentationRegistry.getInstrumentation().targetContext
            val config = …
Run Code Online (Sandbox Code Playgroud)

android android-espresso android-instrumentation android-workmanager dagger-hilt

6
推荐指数
1
解决办法
1464
查看次数

具有超时结果的 Kotlin Flow

我正在尝试在 CoroutineWorker(WorkManager) 中使用 Flow,并且该流应该侦听存储库中的值 5 秒,如果您在该时间范围内获得该值,则返回 Result.success() 然后忽略/取消计时器,如果时间过去了,则返回 Result.failure()

现在我有类似的事情,我正在尝试将超时纳入其中。

 repository.getListeningValue.onEach {
     //doStuff here with the result
 }.map{
     Result.success()
 }.first()
Run Code Online (Sandbox Code Playgroud)

android kotlin android-workmanager kotlin-coroutines kotlin-flow

6
推荐指数
1
解决办法
6768
查看次数

活动线程崩溃

遇到了一些ActivityThread我无法理解的崩溃。其中一些指向定期工作的第三方库,如 Workmanager、Firebase 等。其中大多数的根本原因是,DeadSystemExceptionThe core Android system has died and is going through a runtime restart.这种情况如此常见吗?

堆栈跟踪 1:

Fatal Exception: java.lang.RuntimeException: Unable to create service androidx.work.impl.background.systemjob.SystemJobService: java.lang.RuntimeException: android.os.DeadSystemException
       at android.app.ActivityThread.handleCreateService(ActivityThread.java:3689)
       at android.app.ActivityThread.access$1500(ActivityThread.java:207)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1774)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:193)
       at android.app.ActivityThread.main(ActivityThread.java:6898)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
    Caused by java.lang.RuntimeException: android.os.DeadSystemException
       at android.app.ActivityThread.handleCreateService(ActivityThread.java:3683)
       at android.app.ActivityThread.access$1500(ActivityThread.java:207)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1774)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:193)
       at android.app.ActivityThread.main(ActivityThread.java:6898)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Run Code Online (Sandbox Code Playgroud)

堆栈跟踪 2:

Fatal Exception: java.lang.RuntimeException: Unable to …
Run Code Online (Sandbox Code Playgroud)

java android firebase android-workmanager

6
推荐指数
0
解决办法
504
查看次数