在我的应用程序中,我正在使用BrowserField显示一个网站。当选择网站内的每个链接时,我需要显示加载屏幕,以便用户不会感到空白。
我能够在此方法中添加加载屏幕
public void documentCreated(BrowserField browserField,
ScriptEngine scriptEngine, Document document)
但问题是只有在建立连接时才会调用此方法,因此在显示加载屏幕之前会有延迟。
所以我尝试实现ProtocolController并在此方法中添加加载屏幕
public void handleNavigationRequest(BrowserFieldRequest request)
但是,加载屏幕会在一小段延迟后显示(与在documentCreated方法下相同)
这是我的代码段
public void handleNavigationRequest(BrowserFieldRequest request)
throws Exception {
if (!NetworkUtil.isNetworkAvailable()) {
Dialog.inform(Strings.NETWORK_ERROR);
} else {
UiApplication.getUiApplication().invokeAndWait(new Runnable() {
public void run() {
BaseScreen.showLoadingProgress(Strings.LOADING);
}
});
InputConnection ic = handleResourceRequest(request);
browserField.displayContent(ic, request.getURL());
}
}
我也在线程之外尝试了这个......仍然发生了同样的事情。为了测试,我在这个方法中添加了一个对话框,它在我点击网站内的任何链接的同时出现。只有这个加载屏幕需要时间来加载。
有没有办法让这种情况发生?
此外,与本机浏览器相比,浏览器字段加载网站所需的时间更长。
我在这里遗漏了什么!请帮忙
我已按照您的建议尝试了documentUnloading方法。但它没有被触发。下面给出的是代码片段,请你在这里查看我做错了什么...... !!
protected void onUiEngineAttached(boolean attached) {
if (attached) {
BaseScreen.showLoadingProgress(Strings.LOADING);
}
super.onUiEngineAttached(attached);
}
try {
listener = new BrowserFieldListener() {
// Page starts loading...
public void documentCreated(BrowserField browserField,
ScriptEngine scriptEngine, Document document)
{
// show the loading screen
//showLoadingProgress(Strings.LOADING);
}
public void documentError(BrowserField browserField,
Document document) {
hideLoadingProgress();
Dialog.inform(Strings.NETWORK_ERROR);
}
public void documentAborted(BrowserField browserField,
Document document) {
hideLoadingProgress();
Dialog.inform(Strings.NETWORK_ERROR);
}
public void documentUnloading(BrowserField browserField,
Document document) {
BaseScreen.showLoadingProgress(Strings.LOADING);
}
// Page loaded
public void documentLoaded(BrowserField browserField,
Document document) {
// the document has loaded, hide loading popup ...
BaseScreen.hideLoadingProgress();
}
};
} catch (Exception ex) {
Dialog.inform(Strings.NETWORK_ERROR);
}
browserField.addListener(listener);
// add the browser field to a ui manager or screen
add(browserField);
// request the content
browserField.requestContent(URL);
答案 0 :(得分:0)
我使用BrowserFieldListener执行此操作(请参阅BrowserFieldListener.html)。这有点直观,但我在documentUnloading()中显示加载屏幕,并在documentLoaded()中将其删除。当我第一次填充BrowserField时,我也按下加载屏幕,当关闭BrowserField的屏幕时,我确保也会弹出加载屏幕。所以不是一个漂亮的解决方案,但它对我有用。
是的,一般来说,BrowserField比浏览器慢。我还没找到办法绕过它。然而,一个重要方面是缓存。查找有关为BrowserField创建自己的缓存的信息 - 这里有Thread和BB Web站点上的KB文章。抱歉找不到他们,我会更新。
<强>更新强>
由OP发现,缓存文章为here。
进一步更新
只是澄清两件事:
此处包含演示如何使用Listener的示例: listener sample