-2

数日で公開される Android アプリを開発しました。

ICS でアプリをテストしているときに、別の問題に遭遇しました。Pre-GingerBread および GingerBread バージョンのデバイスでは問題なく動作しています。NetworkOnMainThreadExceptionICSデバイスをテストしたときにスローされ、HTTPコールをAsyncTask.

しかし、私の問題は、4 から 5 の異なるものを作成してHTTP Url callsおり、すべての URL を呼び出すには AsyncTask が必要なことです。これらの URL は次々に同時に実行する必要があるからです。

1 つの URL の結果が失敗した場合、次の URL を呼び出さず、UI で更新する必要があります。だから私はAsyncTask各URL呼び出しを取っています。

AsyncTasks単一のフラグメントに多くを含めることができますか。AsyncTask現在、フラグメントクラスに最大3つまで含めることができました。

AsyncTaskもしそうなら、最初のAsyncTask PostExecuteメソッドから別の実行を開始できます。

前もって感謝します。

4

3 に答える 3

2

すべての HTTP 呼び出しを 1 つにまとめて、 publishProgressコールバックASyncTaskでレポートを返すことができます。1 つが失敗すると、その ASyncTask を停止でき、他のタスクは呼び出されません。

于 2012-08-10T07:16:01.603 に答える
1

1 つの asyncTask で URL を次々に確認し、次の方法で進行状況を公開できるはずです。

http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29

于 2012-08-10T07:28:53.123 に答える
1

ANetworkOnMainThreadExceptionは通常、コードが貧弱であることを示しており、何らかのネットワーク アクティビティを実行しているときにアプリケーションがロックされるため、ユーザー エクスペリエンスが低下します。はい、(残念ながら)ハニカム以前のデバイスでも動作しますが、誰もが求めているものではありません.

問題を解決するには、単一の AsyncTask を使用し、すべての HTTP 呼び出しをdoInBackground()メソッドで連続して実行することを強くお勧めします。呼び出しごとに、呼び出しが成功したかどうかを確認します。成功した場合は、次のメソッドに進みます。失敗した場合は、その直後return nullに HTTP 呼び出しが行われなくなり、onPostExecute()メソッドが自動的に呼び出されます。とてもシンプルです。

これが私が考えていることの例です:

private class DoNetworkStuff extends AsyncTask<String, Integer, String> {

 protected String doInBackground(String... params) {
     // Do network call
     if (!call.hasSucceeded()) return null;

     // Do next network call
     if (!call.hasSucceeded()) return null; // Check if call succeeded - pseudo code

     // Continue this pattern with all your network calls

     return ""; // If this point is reached, all network calls succeeded
 }

 protected void onPostExecute(String result) {
     if (result != null) {
         // All calls succeeded - celebrate!
     } else {
         // A call failed - clean-up...
     }
 }

}

AsyncTask のドキュメントを見て、他のことをする前にそれを理解してください。これはあなたのアプリケーションで完全に機能すると確信しています: http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-08-10T07:41:08.390 に答える