2

1回限りのタスクとしてユーザーの場所を修正する「正しい」方法を探しています。現時点では、私の実行フローは大まかに次のとおりです。

  1. ユーザーがボタンを押します。
  2. ハンドラー(メインのアクティビティコードに含まれています)は、GPSロケーションリスナーをシステムに登録し、可能な限り高速に更新するように設定し、ASyncTaskを起動して終了します。
  3. 実行前に、ASyncTaskはProgressDialogを生成し、他のUIの使用を効果的にブロックします。
  4. バックグラウンドタスクの場合、ASyncTaskはタイムアウトまたはGPSの位置修正を待機します。
  5. 実行後、ASyncTaskは、場所が見つかった場合は関連データをユーザーに表示するか、見つからなかった場合はトーストにエラーを表示します。もちろん、リスナーの登録も解除します。

さて、これは機能しますが、多くの欠点があります。まず、そして明らかに、リクエストが行われている間、アプリとの他のすべてのUIインタラクションがブロックされます。アプリの主な機能はこのタスクを実行することであり、動作中に他に行うことはほとんどないため、これは現在それほど悪くはありません。また、ユーザーがボタンをスパムするのを防ぎます。さらに、ASyncTaskの実行後のフェーズが、実際にロケーション検出ロジックを配置する場所であるかどうかはわかりません(インターネット呼び出しを行います。これは、ASyncTask内で行う方がよい場合がありますか?)。ただし、場所が見つかったという事実と、メインスレッドが何かを実行する必要があるという事実を他にどのように返すかはわかりません。

私は誰かがこれを行うための「正しい」方法について私に知らせてくれることを望んでいました-つまり、このような正しいASyncTaskを使用していて、サービスが関係している場合、そしてインターネット呼び出しの場所後の検索にどのように対処する必要がありますか? )、そしておそらく、いくらか「ブロッキング」呼び出しを行わなければならないアプリの制御フローを一般的にどのように処理するかについて、いくつかの賢明な言葉を与えることさえあります。

必要に応じてコードを提供できますが、最小限の解決策に切り詰めるには少し時間がかかる場合があります。

4

1 に答える 1

1

通常、通話のブロックとUIのブロックは回避する必要があります。この主題に関するRetoMeierの見解を参照してください。

したがって、私はAsyncTask完全にダンプします。Buttonユーザーが修正要求を開始するために使用するを無効にします。postDelayed() Runnableタイムアウトメカニズムにはを使用します。そして、ユーザーが何かをできるようにします(ヘルプを読むなど)。タイトルバーの進行状況インジケーターを使用して、場所の取得に取り組んでいることを示し、修正を取得したとき、またはタイムアウトが発生したときにインジケーターを閉じます。

(それはインターネット呼び出しを行います、それはそれ自体がASyncTask内でより良いかもしれない何かですか?)

それは確かにメインアプリケーションスレッドで行われるべきではありません。ロケーションフィックスが届いたら、を開始しAsyncTaskてデータをフェッチします。

于 2011-05-24T18:07:42.300 に答える