2012-05-21 4 views
2

В моем приложении Android у меня есть обратный вызов из собственного потока в код Java, который необходимо синхронизировать с основным потоком пользовательского интерфейса. Предполагается, что поток пользовательского интерфейса отображает список опций на основе информации, возвращаемой из собственного потока. Пока пользователь не выберет опцию, необходимо блокировать собственный поток. После того, как пользователь выбирает параметр, собственный поток считывает значение и продолжает работать.Android: Синхронизация собственного потока с основным потоком

Я попытался реализовать это решение, используя ConditionVariable, однако я получил ошибку VM с комментарием, обозначающим «Fatal spin-on-suspend, dumping threads».

Похоже, что для синхронизации этих потоков невозможно использовать объект синхронизации на основе Java. Код отлично работает в случае, когда у меня есть два потока Java.

В общем, существует ли какой-либо способ использования объекта синхронизации на основе Java для синхронизации Java и собственного потока, или это необходимо реализовать с помощью NDK с вызовом из потока Java в функцию NDK, которая реализует синхронизацию ?

ответ

2

Способ сделать это не использовать на основе Java объект синхронизации, а скорее на основе объекта синхронизации NDK следующим образом:

static pthread_cond_t uiConditionVariable = PTHREAD_COND_INITIALIZER; 
static pthread_mutex_t uiConditionMutex  = PTHREAD_MUTEX_INITIALIZER; 



/** 
* This function opens the condition variable which releases waiting threads. 
*/ 
JNIEXPORT void JNICALL 
Java_com_Xxxx_openConditionVariable(JNIEnv *env,jobject o) 
{ 
    pthread_mutex_lock(&uiConditionMutex); 
    pthread_cond_signal(&uiConditionVariable); 
    pthread_mutex_unlock(&uiConditionMutex); 
} 

/** 
* This function blocks on the condition variable associated with the 
*/ 
JNIEXPORT void JNICALL 
Java_com_Xxxx_blockConditionVariable(JNIEnv *env,jobject o) 
{ 
    pthread_mutex_lock(&uiConditionMutex); 
    pthread_cond_wait(&uiConditionVariable,&uiConditionMutex); 
    pthread_mutex_unlock(&uiConditionMutex); 
} 
Смежные вопросы