首页 > 解决方案 > 未打开主应用程序时,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();
}

}

标签: androidwebviewworkerandroid-workmanager

解决方案


定期工作请求的最短时间间隔为 15 分钟。您已将其设置为 30 秒。这可能会导致改变旅馆所需的行为


推荐阅读