2011-10-26 8 views
5

Mi accorgo che StrictMode si lamenta abbastanza rumorosamente della creazione di WebView. C'è un modo per migliorare le prestazioni di avvio di un oggetto WebView? Sto istanziando da XML nel mio metodo onCreate().Android WebView causa una violazione 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)); 

Ecco il primo di molti avvertimenti 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 simile quando si crea una WebView in codice: nuova WebView (. GetActivity() getApplicationContext()) ;. Attiva le violazioni del disco di lettura/scrittura. –

risposta

6

C'è un modo per migliorare le prestazioni di avvio di un oggetto WebView?

Non rispetto a quello specifico reclamo StrictMode, poiché proviene dal costruttore WebView.

In generale, non c'è niente che tu possa fare WebView innescando StrictMode - dal momento che è un widget, che non può essere sicuro per voi di fare molto con la WebView su un thread in background, in particolare una volta che è parte del vedi la gerarchia.

È possibile eseguire la scansione di http://b.android.com per verificare se esistono già segnalazioni di bug e, in caso contrario, creare un progetto di esempio che genera il messaggio e archiviarlo insieme a una segnalazione di errore.

+0

Il bug è stato segnalato: https://code.google.com/p/android-developer-preview/issues/detail?id=1375 –

+1

@ MilošČernilovský: Sì. È stato segnalato da me. – CommonsWare

+0

@CommonsWare il collegamento è morto, perché hai segnalato nell'anteprima e non il repository Android principale? – TWiStErRob

0

Se sei infastidito dalla violazione StrictMode o si blocca la vostra applicazione è possibile utilizzare StrictMode.allowThreadDisk*():

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

Ma, purtroppo permettendo legge non è sufficiente:

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) 

Quindi la soluzione finale è:

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

Ho usato il manuale creazione WebView, ma puoi semplicemente mettere questo intorno a setContentView.

2

Una soluzione che ha funzionato per me (Android 5.0) è stato quello di creare una WebView fittizio prima StrictMode impostazione:

… 
new WebView(this); 

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

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

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

Problemi correlati