0

我们的应用程序运行良好,但我们的送货司机经常报告说,当他们尝试同步他们的数据时,它就停在那里。

我可以通过刷新页面或导航到新页面来中断正在进行的同步来模仿他们所看到的内容。

在 Chrome、Firefox 或 IE 中,我只需刷新同步页面,数据就会毫无问题地传到设备上。使用 webView.reload() 或 webView.loadURL 不会在 webview 中执行任何操作。

如果我导航到另一个页面,然后删除所有 cookie 和缓存数据,然后重新登录,选择一条路线并下载 - 它工作正常。如果我删除同一页面中的所有内容并刷新清单 - 它仍然无法正常工作。

我们希望能够在不清除缓存的情况下下载数据,有什么想法吗?

这段代码中有很多日志记录。当同步被中断时 - 下一次尝试冻结在下载事件或检查事件中。

$(document).ready(function () {
    debugMsg('before display sync info', false, true);
    DisplaySyncInfo();
    debugMsg('after display sync info', false, true);
    u = sessionStorage.getItem('user');

    debugMsg('after getting user', false, true);

    if (!u) {
        debugMsg('no user redirecting to login', false, true);
        window.location.href = "login.html";
    }

    debugMsg('check for user', false, true);

    try {
        dataLoadedTarget = new EventTarget();
        debugMsg('eventTarget set', false, true);
        dataLoadedTarget.addListener("dataComplete", downloaddataLoadedEvent);
        debugMsg('listener added', false, true);
    }
    catch (e) {
        debugMsg('add listener error', false, true);
        debugMsg(e, false, true);
    }

});

// Bind the manual update link.
manualUpdate.click(
    function (event) {
        appEvents.html('');
        // Prevent the default event.
        if (event) {
            event.preventDefault();
        }
        // Manually ask the cache to update.
        appCache.update();
    }
);


// Bind to online/offline events.
$( window ).bind(
    "online offline",
    function (event) {
        debugMsg('online offline', false);
        // Update the online status.
        appStatus.text( navigator.onLine ? "Online" : "Offline" );
    }
);

// Set the initial status of the application.
appStatus.text( navigator.onLine ? "Online" : "Offline" );


// List for checking events. This gets fired when the browser
// is checking for an udpated manifest file or is attempting
// to download it for the first time.
$( appCache ).bind(
    "checking",
    function (event) {
        debugMsg('checking', false, true);
        logEvent( "Connecting to Server..." );//checking manifest
    }
);

// This gets fired if there is no update to the manifest file
// that has just been checked.
    $(appCache).bind(
    "noupdate",
    function (event) {
        logEvent("In No Update event..."); //checking manifest
        //TODO some kind of warning??
        debugMsg('in app cache no update, setting to reload', false, true);
        refreshManifest();
        //              logEvent("No Updates Available<br />It appears that you have already synced this data.");
        //                $("#refreshButton").show();
    }
);

$( appCache ).bind(
    "downloading",
    function (event) {
        debugMsg('downloading', false, true);
        logEvent( "Downloading data..." );

        // Get the total number of files in our manifest.
        var test = getTotalFiles();
        debugMsg('downloading, file count= ' + test, false, true);
    }
);

上次尝试的 logcat:

11-12 13:53:07.239:I/Web 控制台(583):appCache 集:1189

11-12 13:53:07.349:I/Web 控制台(583):在显示同步信息之前:1189

11-12 13:53:07.359: I/Web 控制台 (583): DisplaySyncInfo:1189

11-12 13:53:07.359:I/Web 控制台(583):显示同步信息后:1189

11-12 13:53:07.359:I/Web 控制台(583):获取用户后:1189

11-12 13:53:07.369:I/Web 控制台(583):检查用户:1189

11-12 13:53:07.369:I/Web 控制台(583):事件目标集:1189

11-12 13:53:07.379:I/Web 控制台(583):添加的侦听器:1189

11-12 13:53:07.389:I/Web 控制台(583):检查:1189

4

1 回答 1

1

我发现这篇文章出人意料地似乎解决了这个问题。暂时禁用 webview 缓存是关键。

http://blog.divhide.com/2012/11/android-webview-update-app-cache-nicely.html

仅当当前 URL 是同步页面时,我才将此代码放入刷新按钮单击事件中。

WebSettings settings = webView.getSettings();
settings.setAppCacheEnabled(false);

webView.reload();

try {
    Thread.sleep(3500);
} catch (InterruptedException e) {
    e.printStackTrace();
}

settings.setAppCacheEnabled(true);
webView.reload();
于 2013-11-18T17:32:42.857 回答