我曾尝试将数据从Worker数据库保存到Room数据库.
版本:
MainActivity.kt
private fun runDataDownloadWork() {
WorkManager.getInstance()
.beginWith(dwElementTypesWork)
.then(dwElementsWork)
.enqueue()
WorkManager.getInstance().getStatusById(dwElementsWork!!.id)
.observe(this, Observer { workStatus ->
if (workStatus != null && workStatus.state.isFinished) {
Log.d("WorkManager", "dwElementsWork finished")
}
})
}
private fun createWorkRequests() {
dwElementsWork = OneTimeWorkRequestBuilder<DWElementsWork>()
.addTag(DWElementsWork.TAG)
.setConstraints(wifiConstraints)
.build()
dwElementTypesWork = OneTimeWorkRequestBuilder<DWElementTypesWork>()
.addTag(DWElementTypesWork.TAG)
.setConstraints(wifiConstraints)
.build()
}
Run Code Online (Sandbox Code Playgroud)
DWElementsWork.kt
class DWElementsWork : Worker() {
companion object {
const val TAG = "dw_elements_work"
}
override fun doWork(): WorkerResult {
val apiService: APIService = ServiceGenerator
.createService(applicationContext, MyAPIService::class.java) …Run Code Online (Sandbox Code Playgroud) 我正在使用工作经理进行定期任务.我要执行单个工作实例
我的代码如下
val workManager = WorkManager.getInstance()
val callDataRequest = PeriodicWorkRequest.Builder(MyLoggerWork::class.java,
15, TimeUnit.MINUTES)
.addTag(worker)
.build()
workManager.enqueueUniquePeriodicWork(worker, ExistingPeriodicWorkPolicy.KEEP, callDataRequest)
Run Code Online (Sandbox Code Playgroud)
我的工作人员记录如下
18/09/2018 03:18:19
18/09/2018 03:18:19
18/09/2018 03:18:19
18/09/2018 03:18:19
18/09/2018 03:37:18
18/09/2018 03:37:18
18/09/2018 03:37:18
18/09/2018 03:37:18
Run Code Online (Sandbox Code Playgroud)
这是我的MyLoggerWork类
public class MyLoggerWork: Worker(){
override fun doWork(): Result {
addlog()
return Worker.Result.SUCCESS
}
private fun addlog() {
try {
val directory = File(Environment.getExternalStorageDirectory().path + "/", "Jobs")
if (!directory.exists()) {
directory.mkdir()
}
val file = File(directory.path, "jobs_.txt")
if (!file.exists() && directory.exists()) {
file.createNewFile()
}
try { …Run Code Online (Sandbox Code Playgroud) 由于以下错误,我现在的Android项目现在无法构建
AGPBI: {"kind":"error","text":"Program type already present: com.google.common.util.concurrent.ListenableFuture","sources":[{}],"tool":"D8"}
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: /Users/....
Program type already present: com.google.common.util.concurrent.ListenableFuture
Run Code Online (Sandbox Code Playgroud)
我正在使用Android工作室版本
Android Studio 3.2
Build #AI-181.5540.7.32.5014246, built on September 17, 2018
JRE: 1.8.0_152-release-1136-b06 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.11.6
Run Code Online (Sandbox Code Playgroud)
以下链接不太有帮助
Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes.
Run Code Online (Sandbox Code Playgroud)
我为触发此错误所做的更改如下: -
将我的tarke sdk version et.c从27增加到28
compileSdkVersion = 28
targetSdkVersion = 28
minSdkVersion = 21
buildToolsVersion = "28.0.2"
supportLibVersion = "28.0.0"
Run Code Online (Sandbox Code Playgroud)
将我的kotlin版本增加到 ext.kotlin_version = …
android android-gradle-plugin android-guava android-workmanager
有人可以帮我找到我在哪里错了.我需要不断观察网络数据,并在工作人员发生数据更改时更新UI.请注意,这在升级到androidx之前有效.
这是一个工人类.
class TestWorker(val context: Context, val params: WorkerParameters): Worker(context, params){
override fun doWork(): Result {
Log.d(TAG, "doWork called")
val networkDataSource = Injector.provideNetworkDataSource(context)
networkDataSource.fetchData(false)
return Worker.Result.SUCCESS
}
companion object {
private const val TAG = "MY_WORKER"
}
}
Run Code Online (Sandbox Code Playgroud)
其名称如下:
fun scheduleRecurringFetchDataSync() {
Log.d("FETCH_SCHEDULER", "Scheduling started")
val fetchWork = PeriodicWorkRequest.Builder(TestWorker::class.java, 1, TimeUnit.MINUTES)
.setConstraints(constraints())
.build()
WorkManager.getInstance().enqueue(fetchWork)
}
private fun constraints(): Constraints{
return Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build()
}
Run Code Online (Sandbox Code Playgroud)
我还有一个UserDao和UserRepository来获取和存储数据.我正在观察UserRepository中的网络数据,如下所示:
class UserRepository (
private val userDao: UserDao,
private val networkDataSource: NetworkDataSource,
private val appExecutors: …Run Code Online (Sandbox Code Playgroud) android kotlin android-livedata android-architecture-components android-workmanager
在PeriodicTimeRequest最小周期时间为15分。我想将它从 15 分钟减少到不到 15 分钟。我该怎么做?
在初始化工作管理器并创建任一任务后,如果我们在任务执行中使用任何插件,则无法识别并抛出错误,如下所示 MissingPluginException(在通道 lyokone/location 上找不到方法 getLocation 的实现)
实际代码:
Workmanager.executeTask((task, inputData) async {
Location locationObject = Location();
locationObject.getLocation();
print(locationObject);
return Future.value(true);
}
Run Code Online (Sandbox Code Playgroud)
基本上,工作管理器任务中使用的任何其他插件似乎都无法识别。
我错过了什么,我需要重新注册我的所有插件吗?
I/flutter (16120): Location permission has error
I/flutter (16120): MissingPluginException(No implementation found for method serviceEnabled on channel lyokone/location)
我最近将旧应用程序的后台服务迁移到WorkManager。在最近的设备上(包括 sdk 22),它看起来不错,运行重复的工作单元并按预期在设备重新启动时安排它们。
问题是当我针对旧版本(旧在这里非常相关)进行测试时,Android sdk 14 是我的minSdkVersion. 顺便说一句,也WorkManager应该有相同的:根据doc向后兼容 API 14。如标题所述,我得到的错误是:
java.lang.RuntimeException: Unable to get provider androidx.work.impl.WorkManagerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.work.impl.WorkManagerInitializer" on path: /data/app/com.example.myapp.apk
at android.app.ActivityThread.installProvider(ActivityThread.java:4822)
Run Code Online (Sandbox Code Playgroud)
我没有任何自定义 WorkManager 配置/初始化,我只是添加了
implementation 'androidx.work:work-runtime:2.2.0'
Run Code Online (Sandbox Code Playgroud)
到我的模块的 gradle 并非常典型地使用它来安排后台操作。
我们有一个 Android 应用程序,使用 WorkManager 来处理后台同步工作。我们的同步工作者是这样的:
public class SyncWorker extends Worker {
[...]
@NonNull
@Override
public Result doWork() {
if (canNotRetry(getRunAttemptCount())) {
// This could seem unreachable, consider removing... or not... because if stopped by the
// system, the work might be retried by design
CBlogger.INSTANCE.log([...]);
return Result.success();
}
boolean syncOk = false;
//Sync
try (Realm realm = Realm.getDefaultInstance()) {
// Doing sync related ops & network calls
// checking this.isStopped() between operations to quit
// sync activity when worker has …Run Code Online (Sandbox Code Playgroud) 我正在使用 ListenableWorker 来执行后台任务。我也希望操作系统意识到我的服务重要性,所以我打电话
setForegroundAsync(new ForegroundInfo(WorkerConstants.NOTIFICATION_FOREGROUND_ID,
builder.build()));
Run Code Online (Sandbox Code Playgroud)
正如谷歌文档中所建议的那样。
但是当我的服务停止或取消时,我仍然可以看到前台服务通知并且我无法删除它。
此外,我在此通知中添加了取消按钮,但它什么也没做,我无法关闭它:
PendingIntent intent = WorkManager.getInstance(getApplicationContext())
.createCancelPendingIntent(getId());
builder.addAction(R.drawable.ic_redesign_exit,"Stop",intent);
Run Code Online (Sandbox Code Playgroud)
有什么建议?
安卓版本:8.1.0
设备:Infinix X604B
工作管理器:1.0.0-alpha11(最新版本)
安排一个 PeriodicWorkRequest 在每 15 分钟后运行一次。工作请求每 15 分钟运行一次,持续大约一小时。然后 PeriodicWorkRequest 停止工作。在 8 小时内,根本没有安排后台工作。我没有杀死我的应用程序,它在后台。
当我将应用程序带回前台时,PeriodicWorkRequest 再次运行后台任务。在我将我的应用程序置于后台后,没有重复的类似经验。
我为我的应用禁用了电池优化。
这是 My Worker 类示例。
class TestWorker extends Worker {
public TestWorker(
@NonNull Context context,
@NonNull WorkerParameters params) {
super(context, params);
}
@NonNull
@Override
public Result doWork() {
// Adding timestamp of background execution to firestore.
Map<String, String> value = new TreeMap<>();
SimpleDateFormat df = new SimpleDateFormat("hh:mm");
String dateFormat = df.format(Calendar.getInstance().getTime());
value.put("time", dateFormat);
FirebaseFirestore.getInstance()
.collection("my-collection")
.add(value);
return Result.SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
}
我是这样称呼它的:
PeriodicWorkRequest.Builder testBuilder …Run Code Online (Sandbox Code Playgroud) android ×8
kotlin ×3
android-architecture-components ×1
android-room ×1
androidx ×1
flutter ×1
plugins ×1