我有一个执行下一个操作的应用程序:通过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数据(不是所有数据),我开始读取它并在服务器上发送数据.....但是在那之后我仍然可以接收更新,并且永远不会发送!!!