android - 未打开主应用程序时,WorkManager Worker 中的 Webview 未加载
问题描述
我正在为 Android 应用程序开发 WorkManager 工作人员。worker 的功能之一是创建一个 webview,加载 url“file:///”并运行一些 javascript 从 localstroage、indexDB 等中提取数据。
只要主应用程序打开或在后台运行,一切都很好。当应用程序关闭时,工作人员按预期触发,但 WebView 不会一致地加载 url。在 4 次尝试中,URL 通常加载一次。所有其他时间对 onPageFinished 的回调都不会触发。有没有人见过这个?我的代码如下:
创建工人()
public static void createWorker() {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest notificationWork =
new PeriodicWorkRequest.Builder(NotificationHandler.class, 30, TimeUnit.SECONDS)
.setConstraints(constraints)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("LC_NoteService", ExistingPeriodicWorkPolicy.REPLACE, notificationWork);
}
做工作()
public Result doWork() {
Handler handler = new Handler(Looper.getMainLooper());
try
{
handler.post(
new Runnable()
{
@Override
public void run()
{
WebView myWebView = new WebView(getApplicationContext());
myWebView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view, url);
Log.d("TAG", "Inside onPageFinish");
myWebView.evaluateJavascript("javascript:(function() {\n" +
"SOME JAVASCRIPT HERE" +
"})();", new ValueCallback<String>() {
@Override public void onReceiveValue(String s) {
loopBack(); //function for checking data
}
});
}
@Override
public void onReceivedError(WebView view, int errCode, String desc, String failingURL)
{
Log.d("TAG", "WebView Error Code: " + errCode + " Description: " + desc + " URL: " + failingURL);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
public void loopBack()
{
//SOME LOGIC
}
});
Log.d("TAG", "About to Create Set Webview Settings");
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowContentAccess(true);
webSettings.setAllowFileAccess(true);
webSettings.setDomStorageEnabled(true);
webSettings.setDatabaseEnabled(true);
myWebView.getSettings().setDatabasePath("/data/data/" + myWebView.getContext().getPackageName() + "/databases/");
myWebView.loadUrl("file://");
}
}
);
} catch (Exception e)
{
e.printStackTrace();
}
return Result.success();
}
}
解决方案
定期工作请求的最短时间间隔为 15 分钟。您已将其设置为 30 秒。这可能会导致改变旅馆所需的行为
推荐阅读
- python - 在定义的条件下使用 pandas value_counts()
- python - Beautiful Soup 只返回表格的最后一个值
- javascript - 如何在promise中返回body的值
- regex - RegExp 以大写字母开头并以小写字母结尾 or 是一个数字
- java - PMD Gradle 插件中的两层规则集
- powershell - 显示消息框的 Visual Studio Code 问题
- javascript - 如何在 javascript 中实现 Firebase 数据库中的承诺?
- excel - Excel公式提取随机值而不是重复值
- python-3.x - 功能上定义高 D 空间中的分离“优点”
- javascript - Ajax 重新加载后,onclick 功能不起作用