Тихая авария происходит в потоке. NotificationManager, таймер и темы "магия". Нетривиальная проблема, как кажется - PullRequest
1 голос
/ 09 июля 2011

Я столкнулся со следующей забавной проблемой:

private Object lock=new Object();

public void letsSayMain(){
    timer=new Timer();
    task=new RequestMessages();
    timer.schedule(task, FIRST_DELAY, period*60*1000); //period = 10, FIRST_DELAY=10*1000
}

private class RequestMessages extends TimerTask{
    public void run() {
        synchronized(lock){
             foo();
             Log.d(ApplicationConstants.APPLICATION_CLASS_NAME, "Yay, we've just exited the method!");    
        }
    }
    private void foo(){
        .
        .
        //Notification initialization
        .
        .

        Log.d(ApplicationConstants.APPLICATION_CLASS_NAME, "We've about to show the notification.");
        mNotificationManager.notify(z, notificationTransactions); //z is unique int, starting from 1. notificationTransaction - forged notification.
        Log.d(ApplicationConstants.APPLICATION_CLASS_NAME, "We've shoved the notification.");
    }
};

Вывод:

07-09 05:23:50.864: DEBUG/AllApp(6919): We've about to show the notification.

И это все.

Может кто-нибудь сказать мне,в чем проблема и почему выполнение кода потока завершается после вызова mNotificationManager.notify () ???
Кстати, таймер все еще работает, и через 10 минут он снова выполнит этот код.Таймер запускает код в своем собственном потоке.Я не знаю, если поток таймера завершается, а затем снова запускается снова в кратчайшие сроки, но кажется, что поток не поврежден, но выполняет только функцию стека верхнего уровня (которая просто подсчитывает таймер снова).

Android также показывает уведомления.

У меня есть этот notify (), встроенный в цикл for, поэтому для меня очень важно - продолжить его выполнение после вызова mNotificationManager.notify ().

РЕДАКТИРОВАТЬ1: Это действительно похоже на тихий сбой:

PathClassLoader(ClassLoader).loadClass(String) line: 532    
INotificationManager$Stub$Proxy.enqueueNotification(String, int, Notification, int[]) line: 157 
NotificationManager.notify(int, Notification) line: 94  
    .
    .
    .

И следующий шаг - одна строка:

Timer$TimerImpl.run() line: 294

До сбоя

Строка PathClassLoader (ClassLoader) .loadClass (String, boolean): 563

, выполненная дважды два раза, но только из одной строки строки PathClassLoader (ClassLoader) .loadClass (String): 532. На второмвыход - он возвращается к loadClass (String), а в следующий момент - все улетучивается.

Любые предложения - что мне теперь делать ??Я никогда раньше не сталкивался с тихими сбоями ...

...