используя ожидание и уведомление в одном потоке - PullRequest
1 голос
/ 06 мая 2011

У меня есть приложение, которое выполняет следующее: получает данные GPS через DDMS и сохраняет их в базе данных, и пока данные хранятся в базе данных, я также должен запустить поток клиента, который считывает новые данные, хранящиеся в базе данных, иотправляет его на удаленный сервер !!!

Для получения данных 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 я читал базу данных ????Кому я должен реализовать ожидание / уведомление в одном потоке ?? Спасибо ... я здесь для дальнейших вопросов:)

Ответы [ 2 ]

1 голос
/ 06 мая 2011

звучит так, будто вы пытаетесь использовать wat / notify в качестве общего способа передачи сообщений. это не так.

Если вы действительно хотите, чтобы B запускался только после завершения A, сделайте это. запустить A, а затем B на вашем основном потоке. не нужно связываться с синхронизацией / ожиданием / уведомлением.

если A и B могут работать одновременно, создайте объект блокировки, совместно используемый потоком БД и потоком отправки,

Object lock = new Object();

в каждом из потоков синхронизируйте ваши операции над этим объектом.

1 голос
/ 06 мая 2011

wait / notify для синхронизации доступа к общим данным, когда несколько потоков обращаются к ним одновременно.Это не относится к вашему случаю.

Вам нужно просто проверить, существует ли база данных, прежде чем начать ее читать: Запросить, существует ли база данных Android!

...