2012-05-09 23 views
0

私は、座標を取得して画面に表示する簡単なGPSプログラムを実装しました。このデザインを改良して非同期タスクを実装しようとしたとき、GPSは何らかの理由で動作しないようです。 GPSで非同期タスクを使用する際に問題がありますか?ここに私のコードです:非同期タスクでGPSが動作しない

私はそれを実行するたびに、常に例外をキャッチします。 GPS権限はマニフェストに設定されています。私は常にGPS接続がオンラインであることを確認するために別のアプリケーションを使用していますので、それらを潜在的なエラーとして削除しました。正直なところ、他のことは考えられません。非同期タスクがなければ、完璧に動作します!どんな助けも大変ありがとう!ありがとう!

マイ例外logcat編集:他の多くのもののような

05-09 22:56:20.199: E/EXCEPTION:(8874): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
05-09 22:56:20.199: E/EXCEPTION:(8874): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at android.os.Handler.<init>(Handler.java:121) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:173) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:173) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at android.location.LocationManager._requestLocationUpdates(LocationManager.java:579) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at android.location.LocationManager.requestLocationUpdates(LocationManager.java:446) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:163) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:1) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
05-09 22:56:20.199: E/EXCEPTION:(8874):  at java.lang.Thread.run(Thread.java:1019) 
+0

例外はありますか? – Tim

+0

私はlogcatを配置しました。ありがとう – progdoc

+0

は、super.onPostExecute(result)を追加してから試してみます。 onPostExecute –

答えて

4

これはできません。 doInBackground()が返ってくるとすぐにスレッドが消えます。 GPSリスナは、Looperスレッドを操作する必要があるハンドラです。 doInBackground()の冒頭でLooper.prepare()に電話をし、最後にLooper.loop()に電話する必要があります。スレッドのLooperオブジェクトでquit()と呼ぶまで永遠にループします。

AsyncTaskは、実際にはワンショットの一時的なスレッド用に設計されているため、これには通常のスレッドを使用します。しかし、私が推測できない理由はありません。ループを終了するか、ユーザーがアプリを終了しても100%確実に実行する必要があります。

Java Can't create handler inside thread that has not called Looper.prepare()

1

を、GPSリスナーは(UIスレッドのような)愚かスレッドによって聴くことができます。一番簡単なことはUIスレッド経由で行うことです。

また、gpsリスナーは何も理由がないので、このように名前は付けられません。場所を取得してから時間がかかる可能性がある場合にのみ、メソッドは "onLocationChanged"を呼び出します。 "requestLocationUpdates"の呼び出しはすべて非同期であるため、asyncTaskを使用する必要はありません。

0

あなたは汚れていない多くの官能的なやり方場合:あなたはあきらめ直後に

mLocationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE); 
Looper.prepare(); 
Looper.loop(); 
if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){  
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_MINIMUM_TIME, GPS_MINIMUM_DISTANCE, MyFragment.this); 
} 
Looper.myLooper().quit(); 

は基本的に、それは、現在のスレッド、メッセージが実行されるにメインスレッドを作りますこのスレッドはメインスレッドです。私はこれの結果を確信していません。

関連する問題