2012-02-08 12 views
2

データを取得するためにWebサービスに接続するアプリケーションがあります。私はこれを行うAsyncTaskを使用しています。私はエミュレータでこれをテストする場合Android Java AsyncTask isCancelled問題

publishProgress(user.dbsCode() + ": Retrieving Standard Comments"); 
if (!_sync.isCancelled()) { 
    result = _dbFiller.fillStandardCommentsTable(); 
} else { 
    return null; 
} 

正常に動作するようです: は、ここで私はdoInBackgroundで使用しているコードの一部です。 isCancelled()が呼び出されると、&が呼び出されます。私がGalaxy Tabletを使ってテストすると(3.2を使って私のプロジェクトが作成されました)、isCancelledが設定されていればヒットします。

このプロセスは、特定のユーザーがダウンロードしているデータの量によっては時間がかかることがあります。私が最初にやることは、ユーザーのための(ジョブと呼ばれる)リストをダウンロードすることです。私は別のWebサービスを呼び出して、「仕事」のためにさまざまな部分をダウンロードします。各ステップには、同期タスクがキャンセルされているかどうかをチェックしている上記のコードが含まれています。私は本当に失われています。有益なコメントをいただければ幸いです。ちょうど方向でさえ。私は頭が回転しているAsyncTasksについて読んだことがあります。

答えて

0

どのような状況でダウンロードをキャンセルしますか?

スケジューラを制御することは実際にはありません。タスクをキャンセルするには、タスクが完了するまで実行されている可能性があります。実際のハードウェアはおそらくあなたのエミュレータより速いので、これは可能です。

既に完了しているAsyncTaskをキャンセルすることは、私が思い出す限り何もしません。あなたの仕事は完了していないと確信していますか?

+0

私は実際にこの1つのタスクから複数のWebサービスを呼び出しています。それぞれを呼び出す前に、タスクがキャンセルされているかどうかを確認します。なんらかの理由で、エミュレータはWebサービスコールの途中でキャンセルします。タブレットは "isCancelled"を設定する前に通話を終了します。どうして他の人と違って働くのかまだ分かりません。この問題を回避するには、isCancelledフラグが設定されるまで「現在の操作を終了する」という別のダイアログを投げるだけです。 – Chris

+0

@Chris私はあなたの問題が正確であるかまだ分かりません。 'AsyncTask'が(doInBackground()の中から)キャンセルされたかどうかを調べる前にテストが完了すると、それが完了します。 OSは、中間メソッド呼び出しでコードを中断しません。だからこそ、長期実行コードは 'isCancelled()'を呼び出して、それを継続すべきかどうかを知る必要があります。キャンセルは 'AsyncTask'のスレッドの外側で行われるので、何が起きるかについては何も仮定することはできません。 – Argyle

+0

これで、300個のレコードを返すWebサービスがあります。配列リスト。私はイベントの連鎖を開始するメソッドを1つ持っています(Webサービスの呼び出し、XMLの解析、リストの埋め込みなど)。すべてが異なるクラスにあります。私のテストでは、非同期をキャンセルしてArrayListのサイズを確認すると、1と300の間の乱数が得られます。タブレットでキャンセルすると、リストはすべてのレコードがArrayListに挿入されるまで。私は友人の電話(2.3を実行して)を得て、私はエミュレータと同じように彼の電話で同じ結果を得ました。 – Chris