在一个线程中使用wait和notify

时间:2011-05-06 18:20:41

标签: android multithreading wait

我有一个应用程序可以做下一件事:通过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 ...我在这里是为了进一步提问:)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

如果你真的希望B只在A完成后运行,那就去做吧。在主线程上运行A然后B。无需使用/同步/等待/通知。

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

Object lock = new Object();

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