android数据库线程同步的方法,关于android:使用等待并在一个线程内通知

我有一个执行下一个操作的应用程序:通过DDMS接收GPS数据并将其存储在数据库中,而当数据存储在数据库中时,我还应该启动一个客户端线程,该线程读取存储在数据库中的新数据并将其发送到远程服务器!!!

为了接收GPS数据,我需要执行以下操作:

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

locationListener = new MyLocationListener();

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);

然后在LocationChanged方法中,将GPS数据插入数据库中:

private class MyLocationListener implements LocationListener

{

@Override

public void onLocationChanged(Location loc) {

if (loc != null) {

latitude=(int)(loc.getLatitude()* 1E6);

longitude=(int)(loc.getLongitude()* 1E6);

db.insertData1(longitude,latitude);

}

}

现在我的问题是:

我应该如何/在何处启动客户端线程...读取数据库?

它首先尝试在此行之后立即启动客户端线程:

m.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);

但是,如果这样做,我将有可能被强制关闭,因为客户端线程读取了可能为空的数据库。

我怎么知道什么时候开始读取数据库?

我是否应该使用协议等待/通知客户端线程,以便在获取GPS更新时阅读

数据库????

我应该在一个线程中实现谁来等待/通知?Thx ...我在这里还有其他问题:)

听起来您正在尝试使用wat / notify作为传递消息的通用方法。 不是。

如果您确实希望B仅在A完成之后才运行,则可以这样做。 在主线程上先运行A然后运行B。 无需混乱w /同步/等待/通知。

如果A和B可以同时运行,则创建一个在数据库线程和发送线程之间共享的锁对象,

Object lock = new Object();

在每个线程中,同步此对象的操作。

实际上,数据库中的读取是在客户端线程内完成的,这是我执行所有位置更新的第二个线程的原因,因此我不会触发另一个线程?还有一个难题是,我必须在收到位置更新后立即发送位置更新。 ...我等不及要等到收到所有更新后再发送(我有我的理由)

没关系,两个线程,一个锁对象。只需使用该锁同步DB.add()和locations.send()方法(或您所说的任何方法)即可。我希望您的应用清楚表明您正在记录并发送用户位置信息,以及这样做的原因。

最后,如彼得所说,location.send()操作需要可靠地编写,这样,如果数据库不存在或为空,则该调用为无操作。那比试图确保A发生在B之前要好得多。

当多个线程同时访问共享数据时,wait / notify用于同步对共享数据的访问。 它不适用于您的情况。

您需要的是在开始阅读数据库之前简单地检查数据库是否存在:查询Android数据库是否存在!

好吧,那还不够!如果数据库存在并且其中包含一些GPS数据(不是所有数据),我开始读取它并在服务器上发送数据.....但是在那之后我仍然可以接收更新,并且永远不会发送!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值