Webview в WorkManager Worker не загружается, когда основное приложение не открыто - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над WorkManager worker для приложения android. Одной из функций рабочего является создание веб-просмотра, загрузка URL-адреса "file: ///" и запуск некоторого javascript для извлечения данных из localstroage, indexDB и т.д. c.

Все отлично работает, пока основное приложение открыто или работает в фоновом режиме. Когда приложение закрывается, рабочий запускается, как ожидалось, но 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();
}

}

1 Ответ

0 голосов
/ 19 июня 2020

Минимальный временной интервал для Periodi c Work Request составляет 15 минут. Вы установили его на 30 секунд. Это может привести к изменению желаемого поведения

...