如果我有一个PeriodicWorkRequest我可以设置一个时间间隔 - 最小是 15 分钟。但是如何doWork()在不等待 15 分钟的情况下测试我的方法是否有效?
是否可以OneTimeWorkRequest用于测试目的?
提前致谢
我正在/尝试使用 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) 我正在尝试从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
我想在工作人员在后台运行时显示通知。我可以用下面的代码来做到这一点:
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) 我想将 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" />\nRun Code Online (Sandbox Code Playgroud)\n\n并使我的应用程序类实现Configuration.Provider如下接口:
@NonNull\n @Override\n public Configuration getWorkManagerConfiguration() {\n return new Configuration.Builder().setMinimumLoggingLevel(Log.DEBUG).setWorkerFactory(delegatingWorkerFactory).build();\n }\nRun Code Online (Sandbox Code Playgroud)\n\nDagger 设置按预期工作。
\n\n但是我遇到了以下问题:在Application#onCreate我将唯一的定期任务排入队列并在第一次安装应用程序时,此操作总是失败并出现以下错误:
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) 我有一个用于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应用程序启动前没有初始化?
与:实现“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()
当我尝试在包含 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
我正在尝试在 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
遇到了一些ActivityThread我无法理解的崩溃。其中一些指向定期工作的第三方库,如 Workmanager、Firebase 等。其中大多数的根本原因是,DeadSystemException但The 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) android ×10
java ×2
kotlin ×2
android-architecture-components ×1
dagger-hilt ×1
firebase ×1
kotlin-flow ×1