Android-будильник синхронизирован - PullRequest
0 голосов
/ 05 апреля 2011

Я имею в виду http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.html

Там работоспособность потока выглядит следующим образом

Runnable mTask = new Runnable() 
{        
    public void run() 
    {  
        Log.v("service", "thread is running after 5 min");
        // Normally we would do some work here...  for our sample, we will           
        // just sleep for 30 seconds.            
        long endTime = System.currentTimeMillis() + 15*1000;            
        while (System.currentTimeMillis() < endTime) 
        {                
            synchronized (mBinder) 
            {                    
                try 
                {                        
                    mBinder.wait(endTime - System.currentTimeMillis());      
                } 
                catch (Exception e) 
                {                    

                }                
            }            
        }            // Done with our work...  stop the service!            
        AlarmService_Service.this.stopSelf();     
    }    
}

Я признаю, что у меня есть некоторые проблемы с понятием синхронизацииПоток запускает цикл while для ожидания 15 с, в этом цикле у меня есть ожидание 15 с.Итак, как будет выглядеть выполнимый файл, если я просто хочу написать запись в журнале, например, Log.v (TAG, TEXT) ;?Что изменится, если я захочу написать новую запись в свою таблицу базы данных?

Спасибо, А.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

Если вы просто хотите записать в журнал, то все будет нормально работать

Runnable mTask = new Runnable() 
{        
    public void run() 
    {  
        Log.v("TAG", "Some verbose log message");
    }    
}

Необходимость использования synchronized для объекта зависит от того, является ли объект потокобезопасным или нет.Если он не является поточно-ориентированным, вам нужно будет убедиться, что только один поток одновременно обращается к объекту с помощью синхронизированного блока.В вашем примере mBinder не является потокобезопасным, поэтому для вызова метода связующего wait необходимо убедиться, что вы единственный поток, обращающийся к нему.

A runnable наиболеечасто используется для выполнения кода в другом потоке, поэтому длительные операции (такие как IO, но в данном случае просто ожидающие) не блокируют поток пользовательского интерфейса.

0 голосов
/ 05 апреля 2011

Просто замените

попытка {
mBinder.wait (endTime - System.currentTimeMillis ());
} поймать (исключение е) {

}

... с кодом, который вы хотите выполнить?

Синхронизировано только для того, чтобы утверждать, что только один процесс обращается к потоку одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...