私は、特定のhtmlページを読み込み、それらのフォーマットを変更してWebViewで表示する小さなアプリケーションを開発しています。 GUIスレッドでコードを実行すると、WebViewに元のhtmlページを表示させるだけの場合と比べて、パフォーマンスの低下はごくわずかです。しかし、もし私がいい男の子で、私が言われたように言うと、AsyncTaskを使ってバックグラウンドでコードを実行し、GUIが3〜5秒間フリーズしないようにします。 。問題は...私がそうした場合、コードの終了までに10倍以上の時間がかかります。ページの表示に60秒以上かかりますが、これは容認できません。AsyncTask、そのようなパフォーマンスのペナルティヒットを取る必要があります...?
TraceViewは、AsyncTaskが(デフォルト優先度で)約10ミリ秒のチャンクで1秒あたり約4回実行されていることを示しています。許容可能な読み込み時間に近づくためにスレッドの優先順位をMAX_PRIORITYに設定する必要がありますが、それでもGUIスレッドで実行する場合よりも3-4倍の時間がかかります。
私は何か間違っているのですか、これはちょうどそれが動作する方法ですか?そして、それはこのように働かなければならない...?要求されるようにここで
は、コンパイルコードです:
package my.ownpackage.athome;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class AndroidTestActivity extends Activity
{
WebView webview;
//...
private class HelloWebViewClient extends WebViewClient
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
AndroidTestActivity.this.fetch(view, url);
return true;
}
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// To allow to connect to the web and pull down html-files, reset strict mode
// see http://stackoverflow.com/questions/8706464/defaulthttpclient-to-androidhttpclient
if (android.os.Build.VERSION.SDK_INT > 9)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
// webview init etc...
fetch(webview, "http://www.example.com");
}
// This one calls either the AsyncTask or does it all manually in the GUI thread
public void fetch(WebView view, String url)
{
//** Use these when run as AsyncTask in background - SLOW!
//** Takes 30+ seconds at default thread priority, with MAX_PRIORITY 15+ seconds
// AsyncTask<Void, String, String> fx = new FilterX(url, view, this);
// fx.execute(); // running as AsyncTask takes roughly ten times longer than just plain load!
//** Use these when not running as AsyncTask - FAST! takes ~5 seconds
FilterX fx = new FilterX(url, view, this);
fx.onPreExecute();
final String str = fx.doInBackground();
fx.onPostExecute(str);
}
}
class FilterX extends AsyncTask<Void, String, String>
{
WebView the_view = null;
// other stuff...
FilterX(final String url, final WebView view, final Activity activity)
{
the_view = view;
// other initialization
// same code in both cases
}
protected void onPreExecute()
{
// same code in both cases
}
protected String doInBackground(Void... v)
{
// same in both cases...
return new String(); // just to make it compile
}
protected void onPostExecute(final String string)
{
the_view.loadUrl(string);
// same in both cases...
}
}
GUIスレッドで実行したときに、私はすべてのProgressBarものを剥奪、そして私としてAsyncTaskとして実行したときに私のFilterXクラスで正確同じコードを実行するにはMAX_PRIORITY 01でページをロードするために、デフォルトのスレッドの優先度で
- 30+秒以下のタイミングを取得
- 5+ GUIスレッドで実行したときにページをロードする秒
TraceViewは、非同期タスクを使用する際に、ほとんどの時間を費やしていると言いますか? 5秒から60秒になると、コードをリファクタリングしたときに何かがひどく間違っているように聞こえます。 (必要に応じて適切なスニペットを投稿してください) – smith324
実際に「再要因」は起こっていません。 execute()の呼び出しを削除し、代わりにGUIスレッドからdoInBackground()を呼び出します。私は関連する部品を切り取って見せてくれるでしょう、その些細な事を示して、これが何か問題であることを非常に疑うでしょう。 – OppfinnarJocke
あなたは私の最初の質問に答えたことはありません:TraceViewはあなたの時間をどこで使っていると言いますか? – smith324