2011-10-26 61 views
5

我注意到StrictMode非常抱怨WebView的创建。有什么方法可以提高WebView对象的启动性能吗?我在我的onCreate()方法中从XML实例化。Android WebView导致StrictMode违规

webView = (WebView) findViewById(R.id.webview); 
webView.clearCache(true); 
webView.getSettings().setDefaultFontSize(20); 
webView.getSettings().setPluginsEnabled(true); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.setWebViewClient(new MyWebViewClient()); 

WebSettings wb = webView.getSettings(); 
wb.setRenderPriority(WebSettings.RenderPriority.HIGH); 
webView.setWebChromeClient(new MyWebChromeClient(this)); 

这是第一个多StrictMode警告:

D/StrictMode(22781): StrictMode policy violation; ~duration=1869 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2 
D/StrictMode(22781): at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745) 
D/StrictMode(22781): at android.database.sqlite.SQLiteStatement.simpleQueryForLong(SQLiteStatement.java:106) 
D/StrictMode(22781): at android.database.sqlite.SQLiteDatabase.getVersion(SQLiteDatabase.java:928) 
D/StrictMode(22781): at android.webkit.WebViewDatabase.getInstance(WebViewDatabase.java:196) 
D/StrictMode(22781): at android.webkit.WebView.<init>(WebView.java:1002) 
D/StrictMode(22781): at android.webkit.WebView.<init>(WebView.java:979) 
D/StrictMode(22781): at android.webkit.WebView.<init>(WebView.java:969) 
D/StrictMode(22781): at java.lang.reflect.Constructor.constructNative(Native Method) 
D/StrictMode(22781): at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
D/StrictMode(22781): at android.view.LayoutInflater.createView(LayoutInflater.java:505) 
D/StrictMode(22781): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
D/StrictMode(22781): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568) 
D/StrictMode(22781): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 
D/StrictMode(22781): at android.view.LayoutInflater.rInflate(LayoutInflater.java:626) 
D/StrictMode(22781): at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 
D/StrictMode(22781): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
D/StrictMode(22781): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
D/StrictMode(22781): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:214) 
D/StrictMode(22781): at android.app.Activity.setContentView(Activity.java:1660) 
D/StrictMode(22781): at com.myapplication.StartActivity.onCreate(StartActivity.java:886) 
+1

类似的问题,在代码中创建一个web视图时,新的WebView(getActivity()getApplicationContext()) ;。它触发读取/写入磁盘违规。 –

回答

6

有什么办法改进的WebView对象的启动性能?

不是针对该具体的StrictMode投诉,因为它来自WebView的构造函数。

一般来说,没有什么可以做WebView触发StrictMode - 因为它是一个小部件,也未必是安全的,你做很多与WebView在后台线程,尤其是一旦它的一部分视图层次。

您可能会扫描http://b.android.com以查看是否存在有关此问题的错误报告,如果不存在,请创建一个生成消息并将其与错误报告一起存档的示例项目。

+0

该错误已被报告:https://code.google.com/p/android-developer-preview/issues/detail?id=1375 –

+1

@MilošČernilovský:是的。据我所知。 – CommonsWare

+0

@CommonsWare链接死了,你为什么报告预览,而不是主要的Android回购? – TWiStErRob

0

如果你在StrictMode违反困扰或崩溃您的应用程序,你可以使用StrictMode.allowThreadDisk*()

ThreadPolicy realPolicy = StrictMode.allowThreadDiskReads(); 
try { 
    web = new WebView(container.getContext()); 
} finally { 
    StrictMode.setThreadPolicy(realPolicy); 
} 

但遗憾的是允许读取是不够的:

D/StrictMode: StrictMode policy violation; ~duration=546 ms: android.os.StrictMode$StrictModeDiskWriteViolation: policy=245 violation=1 
    at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:732) 
    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1755) 
    at android.webkit.WebViewDatabase.getInstance(WebViewDatabase.java:243) 
    at android.webkit.WebView.<init>(WebView.java:981) 
    at android.webkit.WebView.<init>(WebView.java:958) 
    at android.webkit.WebView.<init>(WebView.java:948) 
    at android.webkit.WebView.<init>(WebView.java:939) 
    at MyFragment.onCreateView(CategoryHelpFragment.java:41) 

所以最终的解决方法是:

ThreadPolicy realPolicy = StrictMode.allowThreadDiskWrites(); 
try { // in older versions of Android WebViewDatabase.getInstance creates/opens a DB and StrictMode complains 
    web = new WebView(container.getContext()); 
} finally { 
    StrictMode.setThreadPolicy(realPolicy); 
} 

我用手册WebView创建,但你可以把它放在setContentView左右。

2

为我工作溶液(安卓5.0)是创建设置StrictMode前一个虚拟的WebView:

… 
new WebView(this); 

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
     .detectAll() 
     .penaltyLog() 
     .build()); 

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
     .detectAll() 
     .penaltyLog() 
     .build()); 
… 
+0

在科特林:StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() .build()) StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder() .detectAll() .penaltyLog() .build()) – airowe

相关问题