我正在尝试使用带有Android Studio的WebView来实现一个简单的Web浏览器应用程序。我想将WebView的状态(例如WebBackForwardList)保存到内部存储中,然后在重新启动该应用程序时将其还原。我不想只加载上次访问的url,相反,我还希望当我调用WebView的import matplotlib.pyplot as plt
import numpy as np
from sklearn.neighbors import KernelDensity
def kernel_density_histo(sig, band=.1):
X = np.linspace(np.min(sig)*0.9, np.max(sig)*1.1, 1000)[:, np.newaxis]
kde = KernelDensity(kernel='gaussian', bandwidth=band).fit(sig[:, np.newaxis])
dens = np.exp(kde.score_samples(X))
plt.figure('kernel_density_histo', clear=True)
plt.semilogx(X,dens, label='kernel')
sig = np.random.lognormal(size=100)
kernel_density_histo(sig)
plt.hist(sig, bins=np.logspace(np.log(np.min(sig)), np.log(np.max(sig)), 30), density=True, rwidth=0.8, label='hist')
plt.legend()
plt.show()
或goBack()
方法时,我希望它从内部存储中恢复上一个和下一个访问的链接。 / p>
我目前已经实现了自己的WebView,WebViewClient和WebChromeClient,并将访问的链接作为字符串保存到内部存储中,因此我可以通过在goForward()
和{{1}的覆盖方法中调用loadUrl()
来加载它们},同时还原。但这使页面的加载速度比WebView自己的goBack()
和goForward()
方法慢,并且也无法恢复滚动位置,缩放等。
所以我有两个问题;
有一种方法可以通过调用goBack()
方法来获取WebView的WebBackForwardList,但是有没有办法设置/编辑WebBackForwardList?
如果没有,重新启动应用程序后如何保存和还原它?
答案 0 :(得分:0)
这不是最好的解决方案,但是我针对这种情况实施了一种解决方法。简而言之,我将WebBackForwardList的项目URL从零保存到当前索引,再保存到名为Stack
的{{1}},从当前索引加最后一个索引保存到backStack
。然后,我将这些堆栈和当前项目的URL保存到内部存储中。
重新启动应用程序时,WebView将加载当前项目URL。当用户想要前进或后退时,我首先检查WebView是否可以前进或后退。如果可以,我调用WebView的forwardStack
方法。如果不能,则从保存到内部存储器的堆栈中弹出并加载URL。
但是,当从goBack()
加载URL时,我不得不将当前WebBackForwardList项的URL推送到backStack
并清除WebView历史记录。这是必需的,因为WebView会将最后加载的URL保存到WebBackForwardList的最后索引。这会扭曲WebBackForwardList,因为我正在加载上一个项目。
目前运行良好,但正如我所说,这不是最佳解决方案。
答案 1 :(得分:0)
您应该使用restoreState
和saveState
进行保存和还原。
class AppWebTab extents WebView{
long unique_tab_id;
public void boolean load(){
File stackpath = new File(getContext().getExternalCacheDir(), "webstack"+unique_tab_id);
if(stackpath.exists()) {
Parcel parcel = Parcel.obtain();
byte[] data = ...//read file as Byte Array
parcel.unmarshall(data, 0, data.length);
parcel.setDataPosition(0);
Bundle bundle = new Bundle();
bundle.readFromParcel(parcel);
parcel.recycle();
WebBackForwardList stacks = restoreState(bundle);
if(stacks!=null && stacks.getSize()>0) {
return true;
}
}
return false;
}
public void save(){
File stackpath = new File(getContext().getExternalCacheDir(), "webstack"+unique_tab_id);
Bundle bundle = new Bundle();
WebBackForwardList stacks = saveState(bundle);
if(stacks!=null&&stacks.getSize()>0) {
Parcel parcel = Parcel.obtain();
parcel.setDataPosition(0);
bundle.writeToParcel(parcel, 0);
byte[] bytes = parcel.marshall();
parcel.recycle();
...//save Byte Array Data to file
} else {
stackpath.delete();
}
}
}
由于使用了铬,因此即使设备离线但本地缓存可用,保存的BackForwardList仍可导航。
但是您不能直接修改WebBackForwardList。因此,如果您有多个表示单个浏览器选项卡的Web视图(豪华但有时有用),则很难合并并保存多个BackForwardList作为一个,这很可惜。