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

同様の問題のコード内のWebViewを作成:新しいWebViewの(。getActivity()getApplicationContext()) ;読み取り/書き込みディスクの違反を引き起こします。 –

答えて

6

は、WebViewのオブジェクトの起動時のパフォーマンスを改善する方法はありますか?それはWebViewコンストラクタから来ているので、その特定のStrictMode苦情に関して

ありません。一般的に

、あなたはおよそWebViewStrictModeをトリガできることは何もありません - それはウィジェットですので、あなたがバックグラウンドスレッドでWebViewで多くを行うためには、それはそれはの一部であり、特に一度、安全でない可能性がありますビューの階層。

http://b.android.comをスキャンして、これに関する既存のバグレポートがあるかどうかを確認し、そうでない場合は、メッセージを生成するサンプルプロジェクトを作成して、バグレポートと共にファイルすることができます。

+0

バグが報告されました:https://code.google.com/p/android-developer-preview/issues/detail?id=1375 –

+1

@MilošČernilovský:はい。それは私によって報告されました。 – CommonsWare

+0

@CommonsWareはリンクがなくなり、プレビューで報告したのはなぜですか?アンドロイドの主なレポではありませんでしたか? – 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

関連する問題