1

無限ループで 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

4

2 に答える 2

0

を使用するとアクティビティがフリーズする理由を確認しましたかHandlerThread? スレッドからアウトを作成し、Handlerスレッド内のハンドラーを介してデータを送信することもできます。

于 2013-10-21T03:31:02.143 に答える