【问题标题】:Insert location coordinates into database after every 1 minute for that device每 1 分钟将该设备的位置坐标插入数据库
【发布时间】:2012-12-27 21:09:58
【问题描述】:

我正在开发一个应用程序,在该应用程序中,我需要在每个 1 minute 之后将 location 存储在数据库中,用于特定的 device/user

假设如果用户在应用程序打开时正在移动,那么他的坐标应该在每个1 minute 之后继续插入到数据库中。因此,我有我的 Web 服务设置,可以将数据插入 MySql 数据库。我已经在插入部分测试了我的 WebService,它工作正常。

但我遇到的问题是 - 我不认为它会在每个 1 minute 之后为该特定设备/用户插入 MySql 数据库。谁能告诉我为什么在每个1 minute 之后都没有发生?如果下面的代码有任何问题,任何人都可以通过提供一些可以按照我上面的场景工作的示例来帮助我吗?

任何想法都会有很大帮助。

private final String id = UUID.randomUUID().toString();
private final String sampleURL = ServerInfo.getServiceURL() + "/insert";

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

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);    

    locationListener = new GPSLocationListener();

    locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            60000, 
             0, 
            this.locationListener);

}

下面是实现LocationListener的类。

private class GPSLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            GeoPoint point = new GeoPoint(
                    (int) (location.getLatitude() * 1E6), 
                    (int) (location.getLongitude() * 1E6));
                }
     // Below code is used to insert into database
            String userId = id;
            String mLatitude = Double.toString(location.getLatitude());
            String mLongitude = Double.toString(location.getLongitude());
            String mProvider = location.getProvider();
            String mHasAltitude = Boolean.toString(location.hasAltitude());
            String mAltitude = Double.toString(location.getAltitude());
            String mHasSpeed = Boolean.toString(location.hasSpeed());
            String mSpeed = Float.toString(location.getSpeed());
            String mHasBearing = Boolean.toString(location.hasBearing());
            String mBearing = Float.toString(location.getBearing());
            String mHasAccuracy = Boolean.toString(location.hasAccuracy());
            String mAccuracy = Float.toString(location.getAccuracy());

            WebServiceTask wst = new WebServiceTask(WebServiceTask.POST_TASK,
                    getApplicationContext(), "Posting data...");

            wst.addNameValuePair("user_id", userId);
            wst.addNameValuePair("mlatitude", mLatitude);
            wst.addNameValuePair("mlogitude", mLongitude);
            wst.addNameValuePair("mprovider", mProvider);
            wst.addNameValuePair("mhasAltitude", mHasAltitude);
            wst.addNameValuePair("mAltitude", mAltitude);
            wst.addNameValuePair("mhasspeed", mHasSpeed);
            wst.addNameValuePair("mspeed", mSpeed);
            wst.addNameValuePair("mhasbearing", mHasBearing);
            wst.addNameValuePair("mbearing", mBearing);
            wst.addNameValuePair("mhasaccuracy", mHasAccuracy);
            wst.addNameValuePair("maccuracy", mAccuracy);

            // This will insert into database
            wst.execute(new String[] { sampleURL });


    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

注意:- 它正在插入到数据库中,但它并没有完全或大约在我需要的时间间隔内插入,即1 minute

【问题讨论】:

  • 您有什么证据表明它没有将数据插入您的数据库?或者问题是它没有在您想要的时间间隔发生?
  • 我认为您必须将所有位置数据保存在本地 sqlite 数据库中,并且您必须每隔一段时间将数据发送到 mysql,这将在网络不可用时有所帮助。
  • @Code-Guru,它正在插入到数据库中,但它并没有完全或大约在我需要的时间间隔发生。

标签: java android location android-location locationlistener


【解决方案1】:

这个问题可能是由几个问题引起的,这些问题不是您作为程序员直接控制的。想到的一些是

  1. 网络可能不可用,因此无法向您的应用发送定位数据。

  2. 行为不端的应用程序占用了 CPU 时间,并且操作系统没有在您想要的时间间隔内中断它。

一般来说,在专为多任务处理而设计的设备上获得准确的计时几乎是不可能的。根据您可以接受的误差范围,以“近似”时间间隔获取数据也可能存在问题。

【讨论】:

  • 感谢信息代码大师。因此,根据我上面提到的情况,它应该可以很好地处理这个locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 60000, 0, this.locationListener);。正确的?如果有任何问题,那么可能主要是您上面提到的问题?
  • @TechGeeky 我不熟悉使用定位服务,所以我不能肯定。您的代码很可能有问题。我试图指出您看到此问题还有其他原因。我不确定如何确定哪个是真正的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2017-04-26
  • 2017-12-06
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多