0

私は LocationListener ( http://developer.android.com/reference/android/location/LocationListener.html ) をテストしており、抽象 onLocationChange を実装しています。

onLocationChange メソッドで、メイン アクティビティの TextViews を変更して、実際の座標の変化を表示しました。

アクティビティが開始され、GPS が接続を開始した後、TextViews は座標が変更されるたびに正確に更新されます。

  • AsyncTask または TextViews を対象とするセカンダリ スレッドを実装していないため、これがどのように可能になるのか疑問に思っていますか?
  • プロセスが非同期でない場合、TextViews は毎回どのように更新されますか?
  • TextView の更新が 1 つしか表示されないか、さらに悪いことに、何も表示されませんか?

これは私のコードです:

package com.example.androidgps_get_coordinates;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {


    TextView textView_lat;
    TextView textView_long;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView_lat=(TextView)findViewById(R.id.textV_lat);
        textView_long=(TextView)findViewById(R.id.textV_long);


        String serviceString=Context.LOCATION_SERVICE;
        LocationManager locationManager;    //remember to import LocationManager
        locationManager=(LocationManager)getSystemService(serviceString);


         locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 0, 0, 
                    new LocationListener() {
                      public void onLocationChanged(Location location) {
                          textView_lat.setText(String.valueOf(location.getLatitude()));
                          textView_long.setText(String.valueOf(location.getLongitude()));
                      }
                      public void onProviderDisabled(String provider) {}
                      public void onProviderEnabled(String provider) {}
                      public void onStatusChanged(String provider, int status, 
                                                  Bundle extras) {}
                    }
                  );

        String provider=LocationManager.GPS_PROVIDER;
        Location l= locationManager.getLastKnownLocation(provider);
    }
4

3 に答える 3

1

onLocationChange場所を取得するたびに呼び出されるためTextView、UI スレッドで実行しているため、 が更新されます。あなたが必要とするもの、AsyncTaskまたは別のものは何Threadですか?

ただし、別のこととして、読み取りを試みる前にのnull値を確認することをお勧めします。Location

于 2013-10-21T08:04:59.670 に答える
1

リスナー (LocationListener) を作成し、requestLocationUpdate* s *() を呼び出しました。これは、プロバイダに定期的に (通常は 1 秒ごとに) 場所を配信するように依頼していることを意味します。

ところで、なぜあなたが次の行を書いたのかわかりません:

Location l= locationManager.getLastKnownLocation(provider);

それは何もしません。

于 2013-10-21T08:11:06.850 に答える
0

onLocationChangedメソッドは、他のリスナーのように機能しonClickListenerます。あなたの場所が変わると、このリスナーが呼び出され、ユーザーがボタンをクリックしたようになります。したがって、Thread を使用する必要はありませんが、ロケーション データなどを保存する場合は、Thread を使用することが重要です。これは、thread で locationListener を使用する私の例ですが、 Thread はデータの送信にのみ使用されます。

    public void onLocationChanged(final Location location) {
    // TODO Auto-generated method stub
    locationThread = new Thread(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            int Status = 0;
            latitudeField=location.getLatitude();
            longitudeField=location.getLongitude();
            Date dt = new Date();
            dt.setDate(dt.getDate());
            Status=CallSoap.CurrentPosition(YarVisitLogin.UserName, YarVisitLogin.Password, YarVisitLogin.Visitor, latitudeField, longitudeField, PersianCalendar.getPersianDate(dt), PersianCalendar.getPersianTime());
            yardb.InsertIntoMyLocations(yardb.getMaxMyLocation_ID()+1, PersianCalendar.getPersianDate(dt), PersianCalendar.getPersianTime(), Double.toString(latitudeField), Double.toString(longitudeField), Status);

        }
    });
    locationThread.start();

}
于 2013-10-21T08:18:41.450 に答える