嘿,我正在 Android 中使用 Nativesript 6.5 + Angular 实现一个每小时请求后台位置的服务。为此,我使用 androidx.work.PeriodicWorkRequest。以下代码在 API 级别高于 26 的设备上运行良好。
@JavaProxy('com.tns.BackgroundLocationService')
export class BackgroundLocationService extends (<any>androidx).work.Worker {
constructor(context, params) {
super(context, params);
return global.__native(this);
}
public doWork() {
// some work here for getting the geolocation
return (<any>androidx).work.ListenableWorker.Result.success();
}
public onStopped() {
console.log("onStopped from MyWorker !!!")
}
}
为了运行 Worker,我使用以下 Typescript 类:
@Injectable()
export class MyWorkerHandler {
constructor() {
}
getJobConstrains() {
return (new (<any>androidx).work.Constraints.Builder()).build();
}
getWorkRequest() {
let constrains = this.getJobConstrains();
return (new (<any>androidx).work.PeriodicWorkRequest.Builder(java.lang.Class.forName("com.tns.BackgroundLocationService"), 15, java.util.concurrent.TimeUnit.MINUTES))
.setConstraints(constrains)
.build()
}
enqueue() {
let worker = this.getWorkRequest();
((<any>androidx).work.WorkManager).getInstance()
.enqueueUniquePeriodicWork("sediDomaChallenger", (<any>androidx).work.ExistingPeriodicWorkPolicy.REPLACE, worker);
}
}
如上所述,此代码在 26 以上的版本中运行良好。但是在具有较低 SDK 的设备上运行它时,我收到以下错误:
JS: ERROR Error: Uncaught (in promise): Error: java.lang.NoClassDefFoundError: java.time.Duration
我确实在stackoverflow上找到了这个线程无法在PeriodicWorkRequest类(WorkManager)中导入java.time.Duration,但从我所看到的来看,我正在版本29上编译我的代码。当我使用时,WorkManager适用于每个Android版本一次性工作请求。
你能告诉我我做错了什么吗?我认为这与配置 NS 有关,或者也许我不太了解 Android,归根结底我是一名 Web 开发人员:)
提前Tnx <3
java.time 仅在 Android 8 (api 26) 中添加 您可以通过 coreLibraryDesugaring 使其在较低版本中可用
编辑你的build.gradle:
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
并添加此依赖项:
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
..
如果它不能像我的项目一样立即工作,请执行构建->清理项目+重建项目