0

私のアプリケーションはgps座標をキャッチし、ハンドラーを使用して定期的に送信する必要があります。onCreateメソッド内で私は次のことを行います。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);

そしてそれでonLocationChanged働き始めます。onCreateの最後に、2.5秒ごとに何かを実行するハンドラーを開始します。onLocationChanged()は別のスレッドで実行されないため、これはターゲットを達成するための正しい方法ではないと思います。そのため、ハンドラーが実行された場合、onLocationは実行できませんでした。
編集
GPS座標の取得を同時に管理する方法(onLocationChangedを実行する方法)がわかりません。タイマーは2.5秒ごとにタスクを実行し、同時にonLocationChangeはタイマーに必要なgps値を設定する必要があります。onLocationChangeにまったく実行されない問題があるのではないかと心配しています。AsyncTaskを使用しようと思いましたが、どのように実行しますか?

4

2 に答える 2

1

あなたはあなたの質問を編集しましたが、あなたの懸念が正確に何であるかはまだ私にはわかりません。

並行性に関する背景情報をいくつか紹介し、それが役立つかどうかを見てみましょう...

それは何ですか

まず、同時実行性とは、複数のスレッドを持つように設計されたソフトウェアを意味します。これは、複数のスレッドが同時に実行されることを意味するわけではありません。これは、複数のコアを持つデバイスがある場合にのみ発生します。デバイスにコアが1つしかない場合、一度に実行されるスレッドは1つだけであり、システムはそれらを切り替えます。

システムが複数のスレッドを持つように設計されたらすぐに、共有オブジェクトを処理するすべてのコード(および使用されるライブラリ)がスレッドセーフであることを確認する必要があります。

なぜそれが必要なのですか

スレッドを使用する必要がある最も一般的な理由は次のとおりです。

  • パーツに分割できる重いコードがあり、複数のコアを持つデバイスがあります。この場合、作業の一部を処理する2つ(またはそれ以上)の同時実行スレッドを使用することで、パフォーマンスを向上させることができます。
  • コードにブロッキング操作があります(つまり、ソケットからの読み取り)。socket.read()が戻るまですべてのプログラムがブロックされないように、これを別のスレッドに移動する必要があります。
  • 最後に、Androidで最も一般的な操作である、長時間の操作(つまり、数秒以上)は、ユーザーエクスペリエンスやユーザーエクスペリエンスの低下を避けるために、UI(ユーザーインターフェイス)で使用されるスレッドとは別のスレッドに移動する必要がありますANRエラー。

あなたの状況

LocationManager使用していることを参照しますHandler。これらのクラスはいずれも、別のスレッドを使用することを意味しません。

LocationManagerコールバックを使用onLocationChange()して、UIスレッドで定義したコードを実行します。

Handlerハンドラーが割り当てられているスレッドでコードを実行します。したがって、UIスレッドでハンドラーを作成した場合、ハンドラーコールバックもそこで実行されます。

新しい(または同じことを行う他のクラス)を作成する場合にのみ、Thread共有オブジェクトに注意する必要がある実際のマルチスレッドアプリがあります。

それが役に立てば幸い。さらに詳しい説明が必要な場合はお知らせください。

よろしく。

于 2012-12-18T14:50:20.977 に答える
1

AsyncTaskを使用してデータをフェッチできます。

この質問を参照してください。答えが見つかることを願っています。

AsyncTaskを使用して位置情報を取得する方法

于 2012-12-18T11:34:32.180 に答える