無限ループで 30 秒ごとに GPS 位置情報を取得し、HTTP 要求を介してサーバーに送信する必要があります。サーバーから適切な応答が得られた場合、GPS スキャンを停止する必要がある場合はエンドレス サイクル。サービスはDataTransferServiceと呼ばれ、GPS スキャナーはこのサービスのGPSTrackerと呼ばれます。問題は、新しい Thread(new Runnable()) で GPSTracker の適切なコンテキストを取得できないことです。ThreadHandler を作成すると、MainActivity がフリーズします。さらに、後で使用するためにサービスで初期化している場合でも、コンテキストも null です。
これが私のDataTransferService.java
public class DataTransferService extends Service {
final static String LOG_TAG = "---===> service";
private boolean isRunning = false;
private GPSTracker gps;
private double lat;
private double lng;
public void onCreate() {
super.onCreate();
Log.d(LOG_TAG, "onCreate");
}
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(LOG_TAG, "onStartCommand");
if (!isRunning) {
StartLocationService();
isRunning = true;
}
return super.onStartCommand(intent, flags, startId);
}
public void onDestroy() {
isRunning = false;
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
public IBinder onBind(Intent intent) {
Log.d(LOG_TAG, "onBind");
return null;
}
private void StartLocationService(final String login, final String password) {
Thread thread = new Thread(new Runnable() {
public void run() {
Log.d(LOG_TAG, "StartLocationService() started");
while (true) {
//CHECK IF SERVICE IS RUNNING
if (!isRunning) {
stopSelf();
break;
}
//HERE IS THE PROBLEM <----------------
gps = new GPSTracker(getApplicationContext());
//GETTING GPS INFO
if(gps.canGetLocation()){
lat = gps.getLatitude();
lng = gps.getLongitude();
}else{
gps.showSettingsAlert();
}
try {
Log.d(LOG_TAG, String.format("location is: %f; %f", lat, lng));
//i wanted to send HTTP request to the server here with the gps coordinates
} catch (MalformedURLException e) {
e.printStackTrace();
}
//SERVICE DELAY
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
}
}
ユーザーが「停止」ボタンを押したときに無限ループを停止したかったので、サイクルをカウントするか停止するかを示す bool 変数を作成しました。
更新:
getApplicationContext() の結果が本当に異なるかどうかを判断するために、いくつかのデバッグ出力 (Thread() の前とその内部) を追加し、すべてのオブジェクトが等しいことがわかりました。Log.d(LOG_TAG, getApplicationContext().toString());
Thread() の前と Thread() の内部で使用Log.d(LOG_TAG, mApplication.getInstance().getApplicationContext().toString());
しました。mApplication はシングルトンです。結果:
D/---===> service(7264): com.my.program.MyApplication@40ce3ee0
D/---===> service(7264): StartLocationService() started
D/---===> service(7264): com.my.program.MyApplication@40ce3ee0
興味がある場合は、ここに私の GPSTracker.java があります: http://pastebin.com/p6e3PGzD