2011-10-26 60 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

相關問題