本文引用的源码为android 4.4.4版本
使用WebView的load(data,”text/html”, “utf-8”)加载含有中文的网页时,页面上的中文字符显示为乱码。网页没有问题,使用PC浏览器查看显示正常。
load方法源码
public void loadData(String data, String mimeType, String encoding) {
checkThread();
if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadData");
mProvider.loadData(data, mimeType, encoding);
}
真正执行加载网页操作的是mProvider,而它是什么类型的对象呢?
private WebViewProvider mProvider;
...
private void ensureProviderCreated() {
checkThread();
if (mProvider == null) {
// As this can get called during the base class constructor chain, pass the minimum
// number of dependencies here; the rest are deferred to init().
//调用方法getFactory获取WebViewFactoryProvider对象,然后使用该对象的createWebView方法创建。
mProvider = getFactory().createWebView(this, new PrivateAccess());
}
}
//生成WebViewFactoryProvider方法
private static synchronized WebViewFactoryProvider getFactory() {
return WebViewFactory.getProvider();
}
WebViewFactoryProvider是一个接口,那么就查看WebViewFactory类。WebViewFactory的getProvider方法调用getFactoryClass()获取到字节码,然后通过反射创建了WebViewChromiumFactoryProvider对象。
public final class WebViewFactory {
//类路径
private static final String CHROMIUM_WEBVIEW_FACTORY =
"com.android.