2011-10-26 11 views
5

Zauważam, że StrictMode narzeka dość głośno na tworzenie WebView. Czy istnieje sposób na poprawę wydajności uruchamiania obiektu WebView? Tworzę instancję z XML w mojej metodzie onCreate().Android WebView powoduje naruszenie 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)); 

Oto pierwsza z wielu ostrzeżeń 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

podobny problem podczas tworzenia WebView w postaci kodu: nowy WebView (. GetActivity() getApplicationContext()) ; Wyzwala naruszenie dysku odczytu/zapisu. –

Odpowiedz

6

Czy istnieje jakiś sposób, aby poprawić wydajność startowego obiektu WebView?

Nie w związku z tą konkretną skargą StrictMode, ponieważ pochodzi ona od konstruktora WebView.

W ogóle nic nie można zrobić WebView wyzwalanie StrictMode - ponieważ jest to widget, to może nie być bezpieczne dla ciebie zrobić wiele z WebView na wątek tła, zwłaszcza gdy jest on częścią zobacz hierarchię.

Użytkownik może zeskanować http://b.android.com, aby sprawdzić, czy istnieją na ten temat zgłoszenia błędów, a jeśli nie, utworzyć przykładowy projekt, który wygeneruje komunikat i złożyć go wraz z raportem o błędzie.

+0

Błąd został zgłoszony: https://code.google.com/p/android-developer-preview/issues/detail?id=1375 –

+1

@ MilošČernilovský: Tak. To zostało zgłoszone przeze mnie. – CommonsWare

+0

@CommonsCzy łącze jest martwe, dlaczego zgłosiłeś się do podglądu, a nie do głównego repozytorium Androida? – TWiStErRob

0

Jeśli przeszkadza naruszenia StrictMode lub zawiesi swoją aplikację można użyć StrictMode.allowThreadDisk*():

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

Ale niestety pozwalając czyta nie wystarczy:

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) 

więc ostateczna obejście jest:

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

Użyłem instrukcji tworzenia WebView, ale możesz to po prostu zamienić na: setContentView.

2

Rozwiązanie że pracował dla mnie (Android 5.0) było stworzenie obojętne WebView przed ustawieniem StrictMode:

… 
new WebView(this); 

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

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

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