对于 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) 我创建一些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
Activivity应用程序中有一个名为 MainActivity 的应用程序。MainActivity 与ViewModelOnCreate 方法中的a 相关联
...
val someViewModel = ViewModelProviders.of(this).get(SomeViewModel::class.java)
...
Run Code Online (Sandbox Code Playgroud)我做了一些背景工作Workers。
val someWork = OneTimeWorkRequestBuilder<LoginWorker>().build()
WorkManager.getInstance().beginUniqueWork("SOMEWORK", ExistingWorkPolicy.REPLACE, captivePortalWork).enqueue()
问题来了……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)
我怎样才能ViewModel从Worker课堂上获得一个?
android android-viewmodel android-architecture-components android-workmanager
根据我从文档https://developer.android.com/topic/libraries/architecture/workmanager中阅读的内容,
它说:
即使您的应用被强制退出或设备重新启动,该任务仍然可以保证运行。
那么这意味着,无论如何,在后台执行的任务都会100%执行到完成为止。
例如:
应用程序具有执行工作管理器实施的按钮,该按钮可将数据上传到在线数据库,但需要Internet连接才能上传数据。因此,我的应用程序当前处于离线模式,然后单击按钮。
我的不确定性:
工作管理器是否会在后台运行该过程,并在没有Internet连接的情况下继续重试该过程?并且仅完成并停止该过程,直到建立Internet连接并完成数据上传?
我正在使用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) 我有一个场景,我必须在特定时间使用 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) 每次启动应用程序时都会出现错误。
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
我已经将 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)
任何帮助,将不胜感激
谢谢
由于我需要在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
我正在使用工作管理器和 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
android ×8
android-architecture-components ×4
background ×1
java ×1
performance ×1
realm ×1
workmanagers ×1