【发布时间】:2020-06-17 04:48:26
【问题描述】:
我正在为 Android 应用程序开发 WorkManager 工作者。 worker 的功能之一是创建一个 webview,加载 url "file:///" 并运行一些 javascript 从 localstroage、indexDB 等中提取数据。
只要主应用程序打开或在后台运行,一切都会很好。当应用程序关闭时,工作人员按预期触发,但 WebView 不会一致地加载 url。在 4 次尝试中,URL 通常加载一次。所有其他时间对 onPageFinished 的回调都不会触发。有没有人见过这个?我的代码如下:
createWorker()
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);
}
doWork()
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();
}
}
【问题讨论】:
标签: android webview worker android-workmanager