我有一个应用程序可以做下一件事:通过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更新时,我读了 数据库???? 我应该在一个线程中实现wait / notify?Thx ...我在这里是为了进一步提问:)
答案 0 :(得分:1)
wait / notify用于在多个线程同时访问共享数据时同步对共享数据的访问。它不适用于您的情况。
您需要的是在开始阅读之前简单地检查数据库是否存在:Query if Android database exists!
答案 1 :(得分:1)
听起来你正在尝试使用wat / notify作为传递消息的通用方法。不是。
如果你真的希望B只在A完成后运行,那就去做吧。在主线程上运行A然后B。无需使用/同步/等待/通知。
如果A和B可以同时运行,则创建一个在DB线程和发送线程之间共享的锁定对象,
Object lock = new Object();
在每个线程中,同步您对此对象的操作。