标签: android-workmanager

Android Workmanager PeriodicWorkRequest 不是唯一的

对于 OneTimeWorkRequest,我们可以使用 WorkContinuation 来确保如果作业已经被安排,我们可以保留或替换它。PeriodicWorkRequest 没有这样的选项,因此每次创建我的主要活动时都会创建一个新作业,一段时间后我会收到此异常。

java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs
Run Code Online (Sandbox Code Playgroud)

所以我正在尝试以下内容来创建一个“独特的周期性作品”

public void schedule(){
    Constraints constraints = new Constraints.Builder().setRequiresBatteryNotLow(true).build();
    OneTimeWorkRequest zombieSpawnWorker = new OneTimeWorkRequest.Builder(ZombieSpawnWorker
            .class).setInitialDelay(15, TimeUnit.MINUTES).setConstraints(constraints).addTag(ZombieSpawnWorker.TAG).build();
    this.setUuid(zombieSpawnWorker.getId());
    WorkManager.getInstance().beginUniqueWork(TAG,
                    ExistingWorkPolicy.KEEP,
                    OneTimeWorkRequest.from(ZombieSpawnWorker.class));
}
Run Code Online (Sandbox Code Playgroud)

然后在工作结束时再次调用此方法

public WorkerResult doWork() {
    try {
        //work to be done
    } catch (Exception e) {
        Log.e(TAG,e.getLocalizedMessage());
        return WorkerResult.FAILURE;
    }
    schedule();
    return WorkerResult.SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

android-workmanager

3
推荐指数
1
解决办法
2338
查看次数

如何清除Android中由WorkManager创建的WorkStatus?

我创建一些OneTimeWorkRequest当我使用android-arch work WorkManager时。

我可以看WorkStatus通过这样的观察员

final WorkManager workManager = WorkManager.getInstance();
final LiveData<List<WorkStatus>> workStatus =
    workManager.getStatusesByTag(DailyWorker.DAILY_WORK);
observer = new Observer<List<WorkStatus>>() {
  @Override public void onChanged(@Nullable List<WorkStatus> workStatuses) {
    Log.d("WorkManager", "onChanged  = workStatuses = " + workStatuses);
    if (workStatuses == null || workStatuses.size() == 0) {
      //DailyWorker.createNewPeriodWork();
    } else {
      Log.d("WorkManager ", "onChanged  = workStatuses.size() = " + workStatuses.size());
      for (int i = 0; i < workStatuses.size(); i++) {
        Log.d("WorkManager ", "onChanged Work Status Id: " + workStatuses.get(i).getId());
        Log.d("WorkManager …
Run Code Online (Sandbox Code Playgroud)

android-livedata android-architecture-components android-workmanager

3
推荐指数
1
解决办法
1382
查看次数

如何从 Worker 类中获取 ViewModel?

  1. 我的Activivity应用程序中有一个名为 MainActivity 的应用程序。
  2. MainActivity 与ViewModelOnCreate 方法中的a 相关联

    ...
    val someViewModel = ViewModelProviders.of(this).get(SomeViewModel::class.java)
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我做了一些背景工作Workers

    val someWork = OneTimeWorkRequestBuilder<LoginWorker>().build() WorkManager.getInstance().beginUniqueWork("SOMEWORK", ExistingWorkPolicy.REPLACE, captivePortalWork).enqueue()

  4. 问题来了……worker例如,循环 10 次,每次只睡一秒钟……所以我们有 10 秒的后台工作。我想更新ViewModel以显示后台工作的进度并每次更新UI。

    A) 我可以从 MainActivity 访问 View 模型并观察worker但我只能ViewModel在进度成功或失败时更新...这意味着我可以在工作完成 0 或 100% 时显示进度。

    B) 如果我可以从 Worker 类访问 ViewModel,我可以随时更新 ViewModel。但我不知道如何......这个方法在 Worker 类中不起作用。

    val someWork = ViewModelProviders.of(this).get(SomeViewModel::class.java)

    我怎样才能ViewModelWorker课堂上获得一个?

android android-viewmodel android-architecture-components android-workmanager

3
推荐指数
2
解决办法
4621
查看次数

Android Work Manager-Work Manager是否会100%确保完成后台执行?

根据我从文档https://developer.android.com/topic/libraries/architecture/workmanager中阅读的内容,

它说:

即使您的应用被强制退出或设备重新启动,该任务仍然可以保证运行。

那么这意味着,无论如何,在后台执行的任务都会100%执行到完成为止。

例如:

应用程序具有执行工作管理器实施的按钮,该按钮可将数据上传到在线数据库,但需要Internet连接才能上传数据。因此,我的应用程序当前处于离线模式,然后单击按钮。

我的不确定性:

工作管理器是否会在后台运行该过程,并在没有Internet连接的情况下继续重试该过程?并且仅完成并停止该过程,直到建立Internet连接并完成数据上传?

android workmanagers android-workmanager

3
推荐指数
1
解决办法
3371
查看次数

在WorkManager中需要上下文

我正在使用WorkManager 1.0.0-alpha05我的应用程序可能运行或未运行的功能来安排某些任务.我要做的工作需要context如何将上下文传递给它?

class CompressWorker : Worker() {

    override fun doWork(): Result {
        //need context here
        Log.e("alz", "work manager runs")
        return Result.SUCCESS
    }
 }
Run Code Online (Sandbox Code Playgroud)

这是我如何初始化工作.

val oneTimeWork = OneTimeWorkRequestBuilder<CompressWorker>()
        .setInitialDelay(15, TimeUnit.MINUTES)
        .build()

WorkManager.getInstance().enqueue(oneTimeWork)
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-workmanager

3
推荐指数
1
解决办法
2707
查看次数

如何在特定时间排队 WorkManager OneTimeWorkRequest

我有一个场景,我必须在特定时间使用 WorkManager 向用户发出通知。

我如何在特定时间安排工作,即使用户强制杀死应用程序,它也应该显示出来。或应用程序未运行。

我当前的代码如下:

Data d = new Data.Builder().putInt(IntentConstants.SCHEDULE_ID, scheduleData.getScheduleID()).build();
OneTimeWorkRequest compressionWork =
    new OneTimeWorkRequest.Builder(ScheduleWorker.class)
        .setInputData(d)
        .build();
WorkManager.getInstance().enqueue(compressionWork);
Run Code Online (Sandbox Code Playgroud)

java android android-workmanager

3
推荐指数
1
解决办法
2337
查看次数

E/SQLiteLog: (283) 从 WAL 文件中恢复的帧

每次启动应用程序时都会出现错误。

E/SQLiteLog: (283) recovered 22 frames from WAL file /data/data/com.dmitrysimakov.kilogram/databases/androidx.work.workdb-wal
Run Code Online (Sandbox Code Playgroud)

该应用程序工作正常,但我想知道为什么会出现此错误。database/androidx.work.workdb-wal 它是 Worker 的日志。我使用 Worker 来预填充我的数据库。

Room.databaseBuilder(app, KilogramDb::class.java, "kilogram.db")
            .addCallback(object : RoomDatabase.Callback() {
                override fun onCreate(db: SupportSQLiteDatabase) {
                    super.onCreate(db)
                    val request = OneTimeWorkRequestBuilder<SeedDatabaseWorker>().build()
                    WorkManager.getInstance().enqueue(request)
                }
            })
            .fallbackToDestructiveMigration()
            .build()
Run Code Online (Sandbox Code Playgroud)

android android-sqlite android-architecture-components android-workmanager

3
推荐指数
1
解决办法
3151
查看次数

如何从 Android 中的 WorkManager 取消工作?

我已经将 WorkManagerUUID转换为StringRealm 数据库。

这是代码 -

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
            Data inputData = new Data.Builder().putString("downloadUrl", downloadUrl).
                    putString("destinationFolder", destinationFolder).
                    putInt("suraNumber", Integer.parseInt(suraNumber)).
                    putString("fileName", fileName).
                    putBoolean("downloadFileTypeBangla", downloadFileTypeBangla).
                    putBoolean("downloadFileTypeArabic", downloadFileTypeArabic).
                    putBoolean("downloadFileTypeArabicWithBangla", downloadFileTypeArabicWithBangla).build();
            OneTimeWorkRequest downloadWork = new OneTimeWorkRequest.Builder(DownloadWorker.class).setConstraints(constraints).setInputData(inputData).build();
            WorkManager.getInstance().enqueue(downloadWork);

            Sura sura = dbOperations.getSuraById(Integer.parseInt(suraNumber));
            if(sura != null){
                dbOperations.updateSura(sura, Integer.parseInt(suraNumber), sura.getBnAudioDownloadStatus(), sura.getArAudioDownloadStatus(), 1);
                realm.beginTransaction();
                DownloadStatusModel downloadStatusModel = new DownloadStatusModel();
                downloadStatusModel.setId(new RealmCommonService(realm).newId(DownloadStatusModel.class));
                downloadStatusModel.setDownloadFileType("ArabicWithBangla");
                downloadStatusModel.setActiveStatus(true);
                downloadStatusModel.setDownloadDate(new Date());
                downloadStatusModel.setDownloadedSuraNo(sura.getSuraNo());
                downloadStatusModel.setDownloadFileSize(sura.getArBnAudioFileSize());
                downloadStatusModel.setDownloadReferenceId(downloadWork.getId().toString());
                downloadStatusModel.setDownloadedSuraNameBangla(sura.getSuraNameBangla());
                downloadStatusModel.setDownloadStatus(1);
                realm.copyToRealm(downloadStatusModel);
                realm.commitTransaction();
            }
Run Code Online (Sandbox Code Playgroud)

现在我试图取消Work使用这行代码,但没有奏效。

WorkManager.getInstance().cancelWorkById(UUID.fromString(downloadStatusModel.getDownloadReferenceId()));
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

谢谢

android realm android-workmanager

3
推荐指数
1
解决办法
7245
查看次数

如何在后台线程上运行ListenableWorker工作?

由于我需要在WorkManager中异步执行工作,因此我需要使用ListenableWorker,默认情况下,它在主(UI)线程上运行。由于这项工作可能是很长时间的处理任务,可能会冻结接口,因此我想在后台线程上执行它。在使用WorkManager(Android Dev Summit '18)视频中,Google工程师展示了如何手动配置WorkManager以在自定义上运行作品Executor,因此我遵循他的指导:

1)在AndroidManifest中禁用默认的WorkManager初始化程序:

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="com.example.myapp.workmanager-init"
    tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)

2)在Application.onCreate中,使用自定义配置初始化WorkManager,在我的情况下是这样的:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Configuration configuration = new Configuration.Builder().setExecutor(Executors.newSingleThreadExecutor()).build();
        WorkManager.initialize(this, configuration);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我的实际ListenableWorker是这样的:

@NonNull
    @Override
    public ListenableFuture<Result> startWork() {
        Log.d(TAG, "Work started.");
        mFuture = ResolvableFuture.create();
        Result result = doWork();
        mFuture.set(result);
        return mFuture;
    }

    private Result doWork() {
        Log.d(TAG, "isMainThread? " + isMainThread());
        mFusedLocationProviderClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if …
Run Code Online (Sandbox Code Playgroud)

performance android background android-architecture-components android-workmanager

3
推荐指数
1
解决办法
2419
查看次数

使用 WorkManager 时的 Java.util.concurrent.RejectedExecutionException

我正在使用工作管理器和 kotlin 协程

implementation "androidx.work:work-runtime-ktx:2.0.0"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.0'
Run Code Online (Sandbox Code Playgroud)

我的工人班扩展了 CoroutineWorker

我是这样安排的

private const val WORK_TAG = "myWork"
  private val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()

  fun schedule() {
         val work =
            OneTimeWorkRequestBuilder<MyWorker>().setConstraints(constraints).setInitialDelay(6, TimeUnit.HOURS)
                .addTag(WORK_TAG).build()
        WorkManager.getInstance().enqueue(work)
    }
Run Code Online (Sandbox Code Playgroud)

在 Google Play 控制台中,我注意到某些 Android 版本 ( https://ibb.co/DzBkpzy ) 出现崩溃

Fatal Exception: java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 bqHint=4 (has extras) } in androidx.work.impl.constraints.trackers.NetworkStateTracker$NetworkStateBroadcastReceiver@2645398e
       at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:988)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:145)
       at android.app.ActivityThread.main(ActivityThread.java:7007)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

Run Code Online (Sandbox Code Playgroud)

Caused …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-workmanager kotlin-coroutines

3
推荐指数
1
解决办法
1965
查看次数