我遇到了一个大问题...
即使清除缓存、重新启动/删除 AVD 后,Android Studio 的应用程序检查也不会启动。
完成步骤:
当在其他项目上使用它时,它可以工作,但在这个项目上却不行。
其他项目与此项目之间的唯一区别是:
使用 OkHttp 和 Workmanager :
//okhttp
// define a BOM and its version
implementation(platform("com.squareup.okhttp3:okhttp-bom:5.0.0-alpha.11"))
// define any required OkHttp artifacts without version
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")
implementation 'androidx.work:work-runtime-ktx:2.8.1'
Run Code Online (Sandbox Code Playgroud)
即使日志也没有显示任何差异。我在互联网上进行了挖掘,但一无所获。请我需要专家的帮助。
我想用新的JetPack WorkManager(链接到codelabs)组件(在应用程序的沙箱分支中)替换现有数据同步系统的作业调度方面.我现有的系统运行良好,但其中的一些新功能WorkManager会派上用场(例如链接).
我当前的系统使用共享LiveData来传递从正在进行的作业到任何UI元素(RecyclerView在我的情况下)观察它的进度(我实际上是将SwitchMapping ViewModel放入SyncItems 的列表中)
data class SyncItem(
val title: String,
private var _progress: Int,
var total: Int) : BaseObservable() {
var progress: Int
@Bindable get() = _progress
set(value) {
_progress = value
notifyPropertyChanged(BR.progress)
}
}
Run Code Online (Sandbox Code Playgroud)
新WorkManager组件有几种方法(getStatusById,getStatusesByTag等),可用于检索带有一个或多个WorkStatuses 的LiveData ,但这些只报告一个课程粒度状态(运行,成功,失败,取消).
推荐进展的方式是什么(例如'546/1234项下载')到用户界面?的setOutputData/ getOutputData对似乎是用来更之间通信Worker总比与UI(我链接时需要).
附件是当用户打开同步状态页面时(在2个项目已完成,正在进行中),它的外观截图(使用我的旧方法在我的应用程序的[测试]版本中).
在最终产品中,用户将能够取消正在进行的任何作业并重新发出一次性工作请求.通常情况下,工作将被解雇PeriodicWorkRequest.
我正在尝试使用PeriodicWorkRequest安排定期检查.它适用于Android API 23及更高版本,但不适用于Android API 21.在API 21上它只能运行一次.
这是一个示例代码
PeriodicWorkRequest worker = new PeriodicWorkRequest.Builder(TestWorker.class, MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS).setConstraints(Constraints.NONE).addTag(TAG_PERIODIC_WORK_REQUEST).build();
WorkManager.getInstance().enqueue(worker);
测试了最新的alpha03和alpha02
我做错了什么?或者它可能是一个错误?
对于定期任务,我将工作管理器用作:
PeriodicWorkRequest.Builder wifiWorkBuilder =
new PeriodicWorkRequest.Builder(FileUpload.class, 15,
TimeUnit.MINUTES)
.setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.METERED).build());
PeriodicWorkRequest wifiWork = wifiWorkBuilder.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);
Run Code Online (Sandbox Code Playgroud)
我在该活动中有一个活动,如果用户取消选中该复选框,则会有一个复选框,然后我想停止此作业。所以我停止了工作:
WorkManager.getInstance().cancelAllWorkByTag("wifiJob");
Run Code Online (Sandbox Code Playgroud)
但是停止工作后,我的任务也正在执行。以前我以为下一个作业可能会被执行,此后它将停止,但是在过去的1小时中它执行了4次,而作业仍在后台运行。什么是停止工作的其他方法或正确方法。
根据文档:
使用给定的标签取消所有未完成的工作。请注意,取消是一项尽力而为的政策,已经执行的工作可能会继续运行。
这是什么意思-取消是一项尽力而为的政策,已经执行的工作可能会继续运行。那么阻止这种情况的正确方法是什么
我正在使用版本,implementation "android.arch.work:work-runtime:1.0.0-alpha08"
谢谢
我想从资产文件夹中的json文件中预填充我的Room数据库。我遵循Google Sunflower示例。我复制了SeedDatabaseWorker类:
import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.dmitrysimakov.gymlab.data.GymLabDb
import com.dmitrysimakov.gymlab.data.entity.Training
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import javax.inject.Inject
class SeedDatabaseWorker(val context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
private val TAG = SeedDatabaseWorker::class.java.simpleName
@Inject lateinit var database: GymLabDb
override fun doWork(): Worker.Result {
val plantType = object : TypeToken<List<Training>>() {}.type
var jsonReader: JsonReader? = null
return try {
val inputStream = context.assets.open("training.json")
jsonReader = JsonReader(inputStream.reader())
val plantList: List<Training> = Gson().fromJson(jsonReader, plantType)
database.trainingDao().insert(plantList)
Worker.Result.SUCCESS
} …Run Code Online (Sandbox Code Playgroud) android dagger-2 android-room android-architecture-components android-workmanager
AlarmManager当用户向任务添加截止日期时,我实现了发送通知的功能。但是,当用户关闭设备时,所有警报都将丢失。现在,我正在更新,BroadcastReceiver以接收android.intent.action.BOOT_COMPLETED和重新设置为每个任务设置的所有警报。
我的第一个尝试是将Rx Single所有任务的到期日都高于当前时间BroadcastReceiver,然后重新计划所有警报。问题是Observable一旦BroadcastReceiver没有生命周期,我将无法处置。同样,这似乎不是一个好方法。
在我的研究期间,IntentService对于这种情况,这是一个很好的解决方案,但是我进入了新WorkManager库,并且OneTimeWorkRequest看起来像是一个很好且简单的解决方案。
在Worker被调用和执行正确,但我不能够处理的Observable,因为该onStopped方法不会被调用。
这是基于此代码段的实现:
class TaskAlarmWorker(context: Context, params: WorkerParameters) :
Worker(context, params), KoinComponent {
private val daoRepository: DaoRepository by inject()
private val compositeDisposable = CompositeDisposable()
override fun doWork(): Result {
Timber.d("doWork")
val result = LinkedBlockingQueue<Result>()
val disposable =
daoRepository.getTaskDao().getAllTasks().applySchedulers().subscribe(
{ result.put(Result.SUCCESS) },
{ result.put(Result.FAILURE) }
)
compositeDisposable.add(disposable)
return try …Run Code Online (Sandbox Code Playgroud) android alarmmanager intentservice rx-android android-workmanager
是否可以对工人设置一些自定义约束(条件)?
就我而言,我希望仅在Room数据库的表中有一些可用数据时才执行工作程序。如果表不为空,我可以观察数据库并安排工作程序的时间,但是如果我可以在这种情况下对工作程序设置一些自定义约束,那将更有意义。
我想知道当有出色的解决方案作为WorkManager时,为什么要理会rx或协程。但是对于几乎所有教程,他们都使用协程,所以WorkManager可能有缺点吗?
android kotlinx.coroutines android-jetpack android-workmanager
我必须执行此用例(不是代码,只是正确的用法) 用例:我需要每天在00:30从网络中获取一些数据。这些数据为我提供了一些特定的时间,其中之一大约是4:30(每天以+1分钟-1分钟的时间变化,取决于服务器的响应,不能在任何地方使用++或-逻辑)。在这一点(4:30),我需要安排一个Alarm。尚不清楚:
我应该直接使用AlarmManager吗?
我应该使用WorkManager来获取需要报警的时间,而不是使用AlarmManager吗?
我应该只使用WorkManager吗?
我感到困惑的原因是,我读过的一些博客说,如果我在特定时间做一些工作,最好坚持使用AlarmManager,但仍然可以使用WorkManager来做到这一点。
那怎么办呢?
当视频处理过程中用户从任务管理器中关闭应用程序然后停止处理时,就会出现问题。
我正在使用FFMpeg在android中进行视频文件处理,它工作正常,但是当我在从任务管理器处理过程中关闭应用程序时,视频处理已停止工作,即使我在工作管理器中添加了所有工作。
@Override
public Result doWork() {
shellCommand = new ShellCommand();
ffmpegBinary = new String[] {
FileUtils.getFFmpeg(context).getAbsolutePath()
};
command = concatenate(ffmpegBinary, command);
CommandResult commandResult = getCommandResult(command);
if (command`enter code here`Result.success) {
onSuccess(videoPath);
} else {
onFailure(videoPath);
}
}
//getCommandResult
private CommandResult getCommandResult(String[] command) {
try {
process = shellCommand.run(command, null);
if (process == null) {
return CommandResult.getDummyFailureResponse();
}
checkAndUpdateProcess();
return CommandResult.getOutputFromProcess(process);
} catch(Exception e) {} finally {
Util.destroyProcess(process);
}`enter code here`
return CommandResult.getDummyFailureResponse();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,当应用程序从后台关闭时,父进程会销毁它并同时销毁其所有子进程,FFMpeg正在使用android进程执行命令并在视频处理过程中检查视频文件状态。
期待着听到您的意见。谢谢
android ffmpeg background-process mp4parser android-workmanager
android ×9
alarmmanager ×2
android-architecture-components ×1
android-room ×1
apk ×1
dagger-2 ×1
ffmpeg ×1
mp4parser ×1
okhttp ×1
rx-android ×1