0

我一直在测试 LocationListener ( http://developer.android.com/reference/android/location/LocationListener.html ),并实现了抽象的 onLocationChange。

在 onLocationChange 方法中,我修改了主要活动中的 TextViews 以显示实际坐标变化。

一旦活动开始并在 GPS 开始连接后,TextViews 会在每次坐标更改时正确更新。

  • 我仍然想知道这是怎么可能的,因为我没有实现 AsyncTask 或针对 TextViews 的辅助线程?
  • 如果进程不是异步的,TextViews 每次如何更新?
  • 我不应该只看到 TextView 的一个更新或更糟的是没有?

这是我的代码:

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

您已经编写了侦听器 (LocationListener) 并调用了 requestLocationUpdate* s *() 这意味着您要求提供者定期提供位置 - 通常每 1 秒。

顺便说一句,我不知道你为什么写这行:

Location l= locationManager.getLastKnownLocation(provider);

它什么也不做。

于 2013-10-21T08:11:06.850 回答
1

onLocationChange每次获得位置时都会调用它,因此TextView由于您在 UI 线程中运行它,因此将更新 's。是什么让你觉得你需要一个AsyncTask或一个单独的东西Thread

不过,另一件事是在尝试读取之前检查null值的好习惯。Location

于 2013-10-21T08:04:59.670 回答
0

onLocationChanged方法像其他监听器一样工作onClickListener。当您的位置更改时,此侦听器将调用,就像用户单击按钮一样。所以不需要使用线程,但如果你想保存位置数据或其他东西,使用线程很重要。这是我将 locationListener 与线程一起使用的示例,但线程仅用于发送数据:

    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 回答