我正在使用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) 我如何检查Worker会议Constraints是否已入队?
例如,如果我需要从互联网下载数据并确定Worker只有在有互联网连接的情况下才能运行。我如何在那一刻检查是否Worker满足Constraints提醒用户?
或者,如果我要执行一项可能消耗大量电池电量的任务,并且我想显示Dialog“开始为智能手机的电池充电以开始”的说法
有没有办法WorkManager从外部方法做到这一点,或者我必须从外部方法做到这一点?
我正在创建具有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) 由于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它也会立即开始工作,
我正在使用 : implementation "android.arch.work:work-runtime:1.0.0-alpha04"
任何帮助将不胜感激。
我正在使用 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
工人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
我正在使用 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) 假设我们正在开发一个消息传递应用程序,我们希望将消息发送到给定的对话中,这些消息的顺序仅在该对话中很重要,并且如果该应用程序置于后台,我们希望保证消息将被发送。
该WorkManager#beginUniqueWork方法对此似乎是理想的,该方法uniqueWorkName将是一些对话ID,ExistingWorkPolicy.APPEND并将其用作工作策略以按预定顺序安排工作。
到目前为止,在我的应用程序中,只要每一项工作都返回Result.SUCCESS,那么将来任何计划的工作都将按预期执行。但是,如果一条特定的消息未能以致命的方式发送并返回Result.FAILURE,那么以后所有具有相同对话ID的工作似乎都无法实现Worker#doWork()。
在EnqueueRunnable仔细研究了类的源代码之后,这似乎是一个非常刻意的选择。我无法真正理解的是为什么呢?似乎很奇怪,如果uniqueWorkName失败,则该名称在应用程序的整个生命周期中都变得不可用(这在杀死该应用程序时一直存在)。
此外,我想知道是否有人对此有很好的解决方案,或者是否会在的将来版本中更改WorkManager。到目前为止,我能想到的最好的事情是返回Result.SUCCESS但在输出中编码我自己的失败状态,Data以便工作的任何观察者都知道它已经失败了。但是,这有点尴尬,对于将来的代码维护者来说不是很明显(并且在查看给定段的日志时可能会造成混淆Work)。
也许我原本打算使用独特作品的做法是完全错误的,并且有更好的解决方案。任何想法将不胜感激,谢谢!
我正在使用具有自定义初始化功能的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应用程序使用 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)