标签: android-workmanager

处理WorkManager对网络连接失败的响应

我正在使用WorkManager将数据从本地Room数据库同步到服务器。问题是Room给Loop.MainLooper()中的数据库生成错误,当我按照以下方式使用它时,它工作正常。但是我无法根据任务完成情况在SUCCESS或RETRY上返回“ WorkerResult”。Netwrok丢失时如何停止工作?

public class TestSyncManager extends Worker {

    private final WorkerResult[] workerResult = {WorkerResult.SUCCESS};
    // @Inject            // Dagger2 has not added the support for dependency injection in worker yet.
    private ApiHeader mApiHeader;
    private HandlerThread mHandlerThread;
    private Handler mHandler;
    private Runnable mRunnable;
    private DataManager dataManager;

    @NonNull
    @Override
    public WorkerResult doWork() {
        try {
            //Looper.prepare();
                CommonUtils.Log("usm_work_manager_1", "Work is Started.");

                try {
                    checkNextCall();
                } catch (Exception e) {
                    e.printStackTrace();
                    setWorkerResult(WorkerResult.FAILURE);
                }
            };
            //mHandler = new Handler(Looper.myLooper());
            mHandlerThread = new HandlerThread("LikesHandlerThread");
            mHandlerThread.start();

            Looper looper …
Run Code Online (Sandbox Code Playgroud)

android android-looper android-workmanager

5
推荐指数
1
解决办法
1643
查看次数

Android - 如何检查 Worker 在排队时是否满足约束?

我如何检查Worker会议Constraints是否已入队?

例如,如果我需要从互联网下载数据并确定Worker只有在有互联网连接的情况下才能运行。我如何在那一刻检查是否Worker满足Constraints提醒用户?

或者,如果我要执行一项可能消耗大量电池电量的任务,并且我想显示Dialog“开始为智能手机的电池充电以开始”的说法

有没有办法WorkManager从外部方法做到这一点,或者我必须从外部方法做到这一点?

android android-workmanager

5
推荐指数
1
解决办法
949
查看次数

为什么工作经理中的工人仍处于入队状态?

我正在创建具有NetworkType.CONNECTED约束的OneTimeWorkRequest,但是即使设备已连接到Internet,请求仍处于“已排队”状态

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(SyncWorker.class)
            .setConstraints(constraints)
            .build();

WorkContinuation continuation = mWorkManager.beginUniqueWork("work",
                    ExistingWorkPolicy.KEEP, request);

continuation.enqueue();
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

5
推荐指数
1
解决办法
481
查看次数

使用WorkManager的PeriodicWorkRequest

由于WorkManager是Google I / O中的新功能,因此我正在尝试使用workmanager定期执行任务,

我正在做的是,PeriodicWorkRequest按如下方式安排工作:

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
PeriodicWorkRequest build = new PeriodicWorkRequest.Builder(SyncJobWorker.class, MY_SCHEDULE_TIME, TimeUnit.MILLISECONDS)
           .addTag(TAG)
           .setConstraints(constraints)
           .build();

WorkManager instance = WorkManager.getInstance();
if (instance != null) {
          instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我请求时PeriodicWorkRequest它也会立即开始工作,

  • 有人知道如何停止立即执行工作吗?在使用PeriodicWorkRequest时。
  • 还想知道我们如何重新安排工作?如果我想更改已经安排好的工作时间该怎么办?

我正在使用 : implementation "android.arch.work:work-runtime:1.0.0-alpha04"

任何帮助将不胜感激。

android android-workmanager

5
推荐指数
2
解决办法
5087
查看次数

Workmanager 在待机和打瞌睡模式下不起作用

我正在使用 WorkManager 来安排我的通知,当我的智能手机处于活动状态时它可以工作,但是当我的智能手机处于待机状态时它不起作用。为什么?有一些限制让我这样做吗?管他呢?

CoreActivity.java中的方法notifyPush

public static void notifyPush(String message, Context context)
    {

        //codice di un altro programma

        // Make a channel if necessary
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // Create the NotificationChannel, but only on API 26+ because
            // the NotificationChannel class is new and not in the support library
            CharSequence name = Constants.VERBOSE_NOTIFICATION_CHANNEL_NAME;
            String description = Constants.VERBOSE_NOTIFICATION_CHANNEL_DESCRIPTION;
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);

            // Add the channel
            NotificationManager notificationManager =
                    (NotificationManager) …
Run Code Online (Sandbox Code Playgroud)

android push-notification android-doze-and-standby android-workmanager

5
推荐指数
1
解决办法
4626
查看次数

如何创建WorkerParameters

工人Worker()@Deprecated,所以需要使用

public Worker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }
Run Code Online (Sandbox Code Playgroud)

但WorkerParameters的构造函数是@hide

那么,如何创建WorkerParameters实例呢?


该库是Android后台任务调度库的最新版本,但是该库最近更新了API,以将核心类的旧创建方法标记为已废弃

现在,我不知道如何创建此核心类,因为其中一个参数不会公开构造函数,也无法找到Factory / Builder的工作方式

因此,让我看看是否有人可以在我的Stack Overflower中帮助我。

核心课程是工人?params是WorkerParameters

android android-workmanager

5
推荐指数
1
解决办法
1743
查看次数

Android 中的 WorkManger 不止一次执行 doWork()

我正在使用 WorkManager 来安排一些任务,但问题是工作管理器在一次调用中多次执行这些任务 { doWork() }。


我在用:

'android.arch.work:work-runtime:1.0.0-alpha08'
Run Code Online (Sandbox Code Playgroud)

我试过使用 -alpha07,06,05,04。但我有同样的问题。有时甚至一次执行 5-6 次


这是代码:

public class MyWorker extends Worker {

@NonNull
@Override
public Result doWork() {

    Log.i("CountWorker","0");
    sendNotification("Notice", "A notice was sent");
    return Result.SUCCESS;

}
Run Code Online (Sandbox Code Playgroud)

这是活动

public class MyWorkerActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final PeriodicWorkRequest pwr = new PeriodicWorkRequest
            .Builder(MyWorker.class, 16, TimeUnit.MINUTES)
            .setConstraints(Constraints.NONE)
            .build();

    WorkManager.getInstance().enqueue(pwr);

}
}
Run Code Online (Sandbox Code Playgroud)

这是 Logcat 的结果:

09-24 16:44:35.954 22779-22816/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.970 22779-22817/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.977 22779-22818/com.simran.powermanagement I/CountWorker: 0
Run Code Online (Sandbox Code Playgroud)

jobs android schedule android-workmanager

5
推荐指数
1
解决办法
1658
查看次数

WorkManager:为什么使用“ APPEND” ExistingWork策略进行的唯一工作失败,为什么不允许使用相同名称进行更多工作?

假设我们正在开发一个消息传递应用程序,我们希望将消息发送到给定的对话中,这些消息的顺序仅在该对话中很重要,并且如果该应用程序置于后台,我们希望保证消息将被发送。

WorkManager#beginUniqueWork方法对此似乎是理想的,该方法uniqueWorkName将是一些对话ID,ExistingWorkPolicy.APPEND并将其用作工作策略以按预定顺序安排工作。

到目前为止,在我的应用程序中,只要每一项工作都返回Result.SUCCESS,那么将来任何计划的工作都将按预期执行。但是,如果一条特定的消息未能以致命的方式发送并返回Result.FAILURE,那么以后所有具有相同对话ID的工作似乎都无法实现Worker#doWork()

EnqueueRunnable仔细研究了类的源代码之后,这似乎是一个非常刻意的选择。我无法真正理解的是为什么呢?似乎很奇怪,如果uniqueWorkName失败,则该名称在应用程序的整个生命周期中都变得不可用(这在杀死该应用程序时一直存在)。

此外,我想知道是否有人对此有很好的解决方案,或者是否会在的将来版本中更改WorkManager。到目前为止,我能想到的最好的事情是返回Result.SUCCESS但在输出中编码我自己的失败状态,Data以便工作的任何观察者都知道它已经失败了。但是,这有点尴尬,对于将来的代码维护者来说不是很明显(并且在查看给定段的日志时可能会造成混淆Work)。

也许我原本打算使用独特作品的做法是完全错误的,并且有更好的解决方案。任何想法将不胜感激,谢谢!

android android-jetpack android-workmanager

5
推荐指数
1
解决办法
532
查看次数

使用Robolectric测试时,Android WorkManager出现错误

我正在使用具有自定义初始化功能的Android工作管理器。为此,我在清单中禁用自动初始化

        <provider
        tools:replace="android:authorities"
        android:name="androidx.work.impl.WorkManagerInitializer"
        android:authorities="${applicationId}.work_manager_init"
        android:enabled="false"
        android:exported="false" />
Run Code Online (Sandbox Code Playgroud)

在应用程序代码中,我使用此代码

private fun initWorkManager() {
    WorkManager.initialize(this, Configuration.Builder().run {
        setWorkerFactory(appComponent.daggerWorkerFactory())
        build()
    })
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时,它工作正常。但是当我用roboletric测试时,任何需要上下文的类都RuntimeEnvironment.application将抛出此异常

java.lang.IllegalStateException: WorkManager is already initialized.  
Did you try to initialize it manually without disabling 
WorkManagerInitializer? See WorkManager#initialize(Context, 
Configuration) or the class levelJavadoc for more information.
Run Code Online (Sandbox Code Playgroud)

initWorkManager()GET调用,并抛出这个怎么一回事,因为它不知道自动init的清单已被禁用,并不知我的测试不能读取清单文件中的值。

任何帮助或建议将不胜感激。

android robolectric android-workmanager

5
推荐指数
1
解决办法
671
查看次数

为什么Android Worker成功完成并调用onStopped()

我当前的Android应用程序使用 androidx.work:work-runtime:2.2.0-rc01

我的工作人员代码类似于:

class SyncWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {

    private var syncWorkerResult: Result = Result.success()

    override fun doWork(): Result {

        return syncWorkerResult
    }

    override fun onStopped() {
        Log.i(TAG, "onStopped() $isStopped")

        super.onStopped()

    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解的工人文档,我不应该看到以下日志:

2019-08-21 14:25:55.183 22716-22750/com.my.app I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=70a5ff81-1b4b-4604-9d2e-a0b3d342a608, tags={ com.my.app.sync.SyncWorker, SYNC-IN-PROGRESS-TAG } ]
2019-08-21 14:25:55.202 22716-22768/com.my.app I/SyncWorker: onStopped() true
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

当我的工人报告结果成功和成功时,其定义如下:-

Returns an instance of ListenableWorker.Result that can be used to indicate that the work completed successfully. Any work that …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager androidx

5
推荐指数
1
解决办法
253
查看次数