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

비슷한 문제가 코드에서 웹보기를 만들 때 : 새로운 웹보기 (. getActivity() getApplicationContext()) ; 읽기/쓰기 디스크 위반을 트리거합니다. –

답변

6

있습니까?

해당 StrictMode 불만 사항과 관련하여 WebView 생성자에서 왔기 때문에 불만 사항이 있습니다. 일반적으로

, 당신은에 대한 WebViewStrictMode을 트리거 할 수있는 일은 없다 - 그것은 위젯이기 때문에 당신이 배경 스레드에서 WebView에 많은 일을하는 것은 그것의 일부, 특히 일단 안전하지 않을 수 있습니다 뷰 계층 구조.

http://b.android.com을 검사하여 기존 버그 보고서가 있는지 확인하고 그렇지 않은 경우 메시지를 생성하는 샘플 프로젝트를 만들어 버그 보고서와 함께 제출하십시오. 당신이 StrictMode 위반에 의해 방해하고 또는 앱을 충돌하는 경우

+0

버그가보고되었습니다. https://code.google.com/p/android-developer-preview/issues/detail?id=1375 –

+1

@ MilošČernilovský : 예. 그것은 나에 의해보고되었다. – CommonsWare

+0

@CommonsWare에서 링크가 죽었습니다. 왜 당신은 미리보기에서보고 했습니까? 안드로이드의 주요 저장소가 아닌 이유는 무엇입니까? – TWiStErRob

0

당신이 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) 

최종 해결 is :

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에 넣을 수 있습니다.

나를 위해 일한 용액 (안드로이드 5.0)를 설정 StrictMode 전에 더미 웹보기를 창조하기위한 것이었다
2

:

… 
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