2

私は、選択したときに5秒ごとにGPS位置をサーバーに送信する必要があるアプリケーションで作業しています(自動送信ボタンがオン)。私はアンドロイドが初めてなので、オン/オフボタンを作成する方法と、ボタンがオンのときに5秒ごとにデータを送信するメソッドを呼び出す方法がわかりません。

5 秒ごとに呼び出す必要があるメソッド:

public void postData() throws ClientProtocolException, IOException, Exception {


    String longitude="UK";
    String latitude="UK";
    String altitiude="UK";
    String time="";
    String speed="";

    getCurrentLocation(); // gets the current location and update mobileLocation variables

    if (mobileLocation != null) {
        locManager.removeUpdates(locListener); // This needs to stop getting the location data and save the battery power.

         longitude = ""+mobileLocation.getLongitude();
         latitude = "" + mobileLocation.getLatitude();
         altitiude = "" + mobileLocation.getAltitude();
        String accuracy = "Accuracy" + mobileLocation.getAccuracy();
        time = "" + mobileLocation.getTime();
         speed =""+ (int)(4*mobileLocation.getSpeed());

        editTextShowLocation.setText(longitude + "\n" + latitude + "\n"
                + altitiude + "\n" + accuracy + "\n" + time+ "\n" + speed);
    } else {
        editTextShowLocation.setText("Sorry, location is not determined");

    }
        String url = "http://www.itrack.somee.com/post.aspx?id="+"f1"+"&long="+longitude+"&lat="+latitude+"&alt="+altitiude+"&speed="+speed;



        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);

        try {

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

        } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        } catch (IOException e) {
        // TODO Auto-generated catch block
        }



}
4

4 に答える 4

15

定期的に場所を送信するという、まったく同じ問題に直面しました。ハンドラーとそのpostDelayedメソッドを使用しました。

私のコードの定期的な呼び出し部分は次のようになります。

private final int FIVE_SECONDS = 5000;
public void scheduleSendLocation() {
    handler.postDelayed(new Runnable() {
        public void run() {
            sendLocation();          // this method will contain your almost-finished HTTP calls
            handler.postDelayed(this, FIVE_SECONDS);
        }
    }, FIVE_SECONDS);
}

その後、生理scheduleSendLocation通話を開始したいときに電話するだけです。

于 2012-11-16T19:21:36.490 に答える
1

ばかばかしいほど正しいです、おそらく5秒ごとに現在の場所を送信する理由はありません。その背後にある理論的根拠は次のとおりです。

あなたは本当にユーザーの場所について2つのことだけを気にします:

  1. 彼らは今どこにいますか?

  2. 私が最初の場所を取得してから、彼らは引っ越しましたか?

したがって、満足のいく初期位置を取得したら、ユーザーが次のように移動するたびに、コールバックを取得するために登録することができます。

private LocationListener mLocationListener;

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mLocationListener = new LocationListener() {
        @Override
        public void onLocationChanged(final Location location) {
            updateLocation(location);
        }

        @Override
        public void onStatusChanged(final String provider,
                final int status, final Bundle extras) {
        }

        @Override
        public void onProviderEnabled(final String provider) {
        }

        @Override
        public void onProviderDisabled(final String provider) {
        }
    };
}

そうは言っても、あなたは明らかにこれらの他の人が言ったことを実行し、5秒ごとにタイマーを実行することができます。重要なのは、ほとんどの適切な場所の実行には10〜20秒かかるため、その間隔でのみ実行することをお勧めします。また参考までに、これはバッテリーを殺します

于 2012-11-16T19:25:29.467 に答える
0

を使用できますTimer。でも、最後に送った位置から一定の距離を変えて送るだけの方がいいと思います。このようにして、情報を失うことなく、送信するデータを大幅に減らすことができます。

于 2012-11-16T19:15:12.953 に答える
0

AlarmManager クラスhttp://developer.android.com/reference/android/app/AlarmManager.html 、特に setRepeating 関数を見てください。ただし、それはあなたが望むよりも少し複雑になるでしょう。

于 2012-11-16T19:09:29.963 に答える