0

アクティビティで一度に 6 つの非同期タスクを開始しようとしていonCreate()ます。しかし、私は次のことに気付きました:

a)同じアクティビティを続けると、すべての非同期タスクdoInBackground()が適切に実行されます。

b) 他のアクティビティに切り替えると、4 つまたは 5 つの非同期タスクのみdoInBackground()が実行されます。最後asyncのタスクdoInBackground()は決して実行されません。

誰かが私が間違っているかもしれないことを教えてもらえますか? for ループでさまざまな asynctasks を見つめています。これを onStart() で行うと、このアクティビティに切り替えると、すべての非同期タスクが再度実行されます。助けてください。サンプルコードは次のとおりです。

For(int i=0;i<7;i++){
webServiceTask= WebServiceTask.getInstance();
webServiceTask.execute("");
}
4

2 に答える 2

2

おそらく、次の点のいくつかを考慮する必要があります。

  • WebServiceTask は永続化する価値のある情報を取得していますか (つまり、あまり揮発性がなく、ユーザーが同じデータを何度も何度も要求するリスクが高い): その場合、作業を (Intent)Service にオフロードし、結果は、ResultReceiver または ContentProvider (ほんの数例) を介してアプリに返されます。
  • アプリのプロセスを維持するためのアクティビティやサービスがない場合、AsyncTasks は完了まで実行される保証はありません。
  • WebServiceTask が相互に実行されても問題ない場合は、これらのタスクを順次実行する AsyncTask を 1 つだけ使用するようにコードを変更することもできます。AsyncTask の進行状況レポート メカニズムの実装を検討することもできます。
  • アクティビティが閉じられると、AsyncTask(s) によって実行される操作が意味をなさない場合は、onStop() または onPause() ライフサイクル メソッドで必ず .cancel() してください。
  • Ed Rowland の回答の箇条書き 3 を覚えておいてください。これは、あなたの質問に対する以前のコメントにも投稿しました。

ハッピーコーディング!

于 2012-12-04T09:44:40.067 に答える
1

ユーザーが切り替えた後もプロセスを維持するには、何らかのサービスが必要です。アクティビティがフォーカスを失うと、Android はプロセスを完全にシャットダウンできます。またはあなたの活動。特にシャットダウンされたアクティビティのコンテキストを使用している場合は、どちらも問題を引き起こします。

正しいこと (tm) は、サービスを実装し、実行のために操作をサービスに渡すことです。

4 つのタスクしか同時に実行されない理由はいくつかあります。私の頭の上から:

  • HttpConnection は、サーバーへの接続をプールし、特定のサーバーへの接続の最大数を適切な値に調整します。4音くらい。

  • ターゲット サーバーが同時接続数を調整しています。

  • スレッド プールは、思ったほど大きくありません。API 16 を開始すると (私が思うに)、デフォルトのスレッドプール サイズは 1 スレッドです! (!!) 理論的根拠: どうやら Android OS 開発者は、Android アプリ開発者が間違ったスレッドを行うことにうんざりしているようです。タスクが連続して実行されている可能性はありますか? それはあなたが説明する症状に多かれ少なかれ適合します。

しかし、それは一種の別の問題です。

于 2012-12-04T09:18:43.603 に答える