2011-10-26 21 views
5

Me estoy dando cuenta de que StrictMode se queja bastante fuerte sobre la creación de WebView. ¿Hay alguna forma de mejorar el rendimiento de inicio de un objeto WebView? Estoy instanciando desde XML en mi método onCreate().Android WebView causa la violación de 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)); 

Aquí es la primera de muchas advertencias 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

problema similar cuando se crea una vista web de código: nueva WebView (. GetActivity() getApplicationContext()) ; Desencadena violaciones de disco de lectura/escritura. –

Respuesta

6

¿Hay alguna manera de mejorar el rendimiento de inicio de un objeto WebView?

No con respecto a esa queja específica StrictMode, ya que proviene del constructor WebView.

En general, no hay nada que pueda hacer al respecto WebView activación StrictMode - ya que es un widget, puede que no sea seguro para que usted pueda hacer mucho con el WebView en un subproceso en segundo plano, sobre todo una vez que es parte de la ver jerarquía.

Es posible escanear http://b.android.com para ver si hay informes de fallos existentes acerca de esto, y si no es así, crear un proyecto de ejemplo que genera el mensaje y presentarlo junto con un informe de error.

+0

Se ha informado del error: https://code.google.com/p/android-developer-preview/issues/detail?id=1375 –

+1

@ MilošČernilovský: Sí. Fue informado por mí. – CommonsWare

+0

@CommonsWare el enlace está muerto, ¿por qué informaste en la vista previa y no en el repositorio principal de Android? – TWiStErRob

0

Si usted está preocupado por la violación StrictMode o se bloquea su aplicación se puede utilizar StrictMode.allowThreadDisk*():

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

Pero, lamentablemente lo que lee no es suficiente:

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) 

Así que la solución definitiva es:

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); 
} 

I used manual WebView creation, pero puedes poner esto alrededor de setContentView.

2

Una solución que funcionó para mí (Android 5.0) era crear un WebView maniquí antes de StrictMode:

… 
new WebView(this); 

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

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

En Kotlin: StrictMode.setThreadPolicy (StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() .build()) StrictMode.setVmPolicy (StrictMode.VmPolicy.Builder() .detectAll() .penaltyLog() .build()) – airowe