1

2 つのネットワークから広告を読み込み、起動時にフラッシュ ファイルを webview に設定するアプリがあります。

        public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    airpush=new Airpush(getApplicationContext());
    airpush.startPushNotification(false);
    airpush.startIconAd();
    airpush.startDialogAd();
    airpush.startAppWall();

    mWebView = (WebView) findViewById(R.id.webview);

    mWebView.getSettings().setJavaScriptEnabled(true);

    mWebView.getSettings().setPluginsEnabled(true);

    mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 

    mWebView.setBackgroundColor(Color.parseColor("#000000"));

    mWebView.loadUrl("file:///android_asset/game.swf");

    AdView adView = (AdView)this.findViewById(R.id.adView);
    adView.loadAd(new AdRequest());
4

2 に答える 2

4

AsyncTask誰かがあなたのために単純にアーキテクチャを作成するよりも、アーキテクチャを理解するために少し時間を費やす方がはるかに役立ちます。

AsyncTaskは、実際には拡張して使用するための非常に単純なクラスです。AsyncTaskは、最も単純な形式では、バックグラウンドで実行されるコード(UIスレッドから外れる-これがロックアップの原因です)である可能性がありますが、一部のコードをバックグラウンドで実行し、一部のコードを前に実行できるように設定されています/ after、および必要に応じて進行状況の更新として実行するコード。

以下に示すように、AsyncTaskを拡張する独自のクラスを作成する必要があります。タスクは3つのパラメーターを取ります。1つ目はバックグラウンドで実行される関数に渡されdoInBackground、2つ目は進行状況更新関数に渡すことができるパラメーターのタイプであり、3つ目はonPostExecuteUIスレッドで実行されるfnに渡されるタイプです。バックグラウンド機能が完了した後。以下の簡単な例では、実行後関数または進行状況更新関数に渡される型を含めないため、それらはVoid型になります。

 private class YourTask extends AsyncTask<byte[], Void, Void> {

     protected Long doInBackground(byte[]... data) {
         //get the array
         byte[] array = data[0];

         //do something with it.
         HERE IS WHERE YOU RUN YOUR CODE IN THE BACKGROUND THAT IS TAKING TOO LONG ON THE UI THREAD

         //return null because this type needs to match the last type for returning to the postexec fn
         return null;
     }

 }

タスクを実行する場合は、次のように呼び出します。

new YourTask().execute(someByteArray);

そのため、多くの場合、時間のかかるコードをその関数に貼り付けることができdoInBackgroundますが、UIスレッドから外れており、一部のコードはUIスレッドで実行する必要があるため、注意が必要です。

プロファイリングを実行して、具体的にどのコードがUIスレッドを詰まらせているかを確認し、AsyncTaskを使用してバックグラウンドでそれを実行することをお勧めします。これを行うには、EclipseでDDMSを使用し、メソッドプロファイリングを使用します。もう1つの方法は、Debugクラスを使用して、Debug.startMethodTracing("tracefilename");開始するときに呼び出すことですDebug.stopMethodTracing();。あなたはここでそれについてもっと読むことができます。ただし、コードはurl(mWebView.loadUrl)をロードするので、これが大きなボトルネックになる可能性があると思います。

補遺と同じように、AsyncTaskのより詳細な例が必要な場合は、この便利なドキュメントからのI C&Pdを次に示します。

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

上記の例には、バックグラウンドタスク中のUIの更新の進行状況を例示するコードと、UIスレッドを実行するpostexecutefnで使用されるパラメーターを渡すコードの両方が含まれています。

于 2013-03-16T23:40:42.630 に答える
2

私はあなたのコードをただ作ることはできませんAsyncTaskが、私はあなたに例といくつかの助けを与えることができます。これはの例ですAsyncTask

public class TalkToServer extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);

}

@Override
protected String doInBackground(String... params) {
//do your work here
    return something;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
       // do something with data here-display it or send to mainactivity

}

doInBackground()更新する必要があるUI場合は、他の方法でそれを実行しました。UIネットワーク関連の作業が終了したら、で更新できますonPostExecute()

これはあなたがタスクを呼び出す方法です

TalkToServer myAsync = new TalkToServer() //can add params if you have a constructor
myAsync.execute() //can pass params here for `doInBackground()` method

それがあなたの内部クラスである場合、それはのMainActivityメンバー変数にアクセスできますMainActivity。別のクラスの場合は、次のcontextようなコンストラクターに渡すことができます

TalkToServer myAsync = new TalkToServer(this);

受け入れるコンストラクターとContextその他の必要なパラメーターを作成します

以下のドキュメントを確認し、その仕組みを理解しておくことを強くお勧めします。おそらく、開始時に理解する最大のことは、doInBackground()では実行されないUIため、ここでは更新を試みたくないViewsが、他のAsyncTaskメソッドで、またはデータをに戻し、MainActivityそこで更新すること です。AsyncTask

于 2013-03-16T23:44:48.123 に答える