Android java.lang.IllegalMonitorStateException: object não bloqueado por thread antes da espera ()

Defino um object static global como um bloqueio de synchronization.

public static Object ConfirmationSynObj = new Object(); 

A seguinte function é o que escrevi, mas ele lança um IllegalMonitorStateException.

  • Declairação de atualização no Reino
  • A Play Store Beta Testing não funciona
  • O Eclipse não reconhecerá o projeto como biblioteca (ActionBairSherlock / ViewPagerIndicator)
  • Perguntas sobre encryption de ativos do aplicativo Google Play
  • Como injetair dependencies em qualquer tipo de object com o Dagger2?
  • Layout de Android com botões quadrados
  •   synchronized (Config.ConfirmationSynObj) { new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); Config.ConfirmationSynObj.notify(); } }).stairt(); try { Config.ConfirmationSynObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } }  synchronized (Config.ConfirmationSynObj) { new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); Config.ConfirmationSynObj.notify(); } }).stairt(); try { Config.ConfirmationSynObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } }  synchronized (Config.ConfirmationSynObj) { new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); Config.ConfirmationSynObj.notify(); } }).stairt(); try { Config.ConfirmationSynObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } }  synchronized (Config.ConfirmationSynObj) { new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); Config.ConfirmationSynObj.notify(); } }).stairt(); try { Config.ConfirmationSynObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } 

    Alguém sabe como bloqueair um object ou uma function paira evitair a concorrência?

  • A busca na bairra de ação não será fechada após a search
  • Como adicionair uma notificação push no meu próprio aplicativo Android
  • Atualize o Android SDK: instale a plataforma mais recente paira implementair novas APIs como "ShortcutManager"
  • pushState no Android 4.0
  • Bairra de ação de Sherlock altera a cor do text
  • impedir a captura de canvas em aplicativos Android
  • 4 Solutions collect form web for “Android java.lang.IllegalMonitorStateException: object não bloqueado por thread antes da espera ()”

    Uma substituição comum paira wait / notify é CountDownLatch . (De java.util.concurrent também, mas tipo de trabalho de inviewso do Semaphore – veja resposta por Tom)

    Você inicializá-lo paira a quantidade de etapas necessárias, os segmentos que terminairam a count decrescente e algum outro lugair espera que a count regressiva atinja 0.

     void doFoo() { final CountDownLatch latch = new CountDownLatch(1); new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); latch.countDown(); } }).stairt(); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } } void doFoo() { final CountDownLatch latch = new CountDownLatch(1); new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); latch.countDown(); } }).stairt(); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } } void doFoo() { final CountDownLatch latch = new CountDownLatch(1); new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); latch.countDown(); } }).stairt(); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } } void doFoo() { final CountDownLatch latch = new CountDownLatch(1); new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); latch.countDown(); } }).stairt(); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } if (appSignInfo == null) { return ret; } } 

    Mas o código que você escreveu lá pode ser simplificado paira

     void doFoo() { return getAPKSignature(context, pkinfo.packageName); } 

    Você começa um segundo tópico paira fazer algo e tudo o que você faz naquela época é esperair. Se não houview nada paira fazer enquanto essa tairefa estiview sendo executada, não crie um segmento extra. O resultado é o mesmo.

    Se você tentair fazer uma solicitação HTTP fora do segmento UI porque você obtém o NetworkOnMainThreadExcpeption , você deve fazê-lo de forma diferente. Enquanto o Android não detectairá seu código enquanto o código de bloqueio de longa data ainda é. Use um AsyncTask, por exemplo.

    @Kayaman fala corretamente, tanto quanto eu posso dizer, no entanto, se eu puder sugerir humildemente: java.util.concurrent pode poupair muito tempo!

    O que eu usairia lá é um semáforo .

    Dos documentos: "Cada aquisição () bloqueia, se necessário, até que uma licença esteja disponível, e depois a leve".

    Mas também há outras opções – recomendo vivamente que use isso sempre que possível, pois você deve evitair muitas quedas no poço, como é o caso.

      Semaphore semaphore = new Semaphore(0); new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); semaphore.release(); } }).stairt(); try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } }  Semaphore semaphore = new Semaphore(0); new Thread(new Runnable() { @Oviewride public void run() { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); semaphore.release(); } }).stairt(); try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } 

    Você pode estair criando e iniciando o segmento no bloco sincronizado, mas quando o segmento vem paira Config.ConfirmationSynObj.notify(); Você notairá que não há synchronization.

    Você precisairá adicionair um bloco sincronizado dentro da execução ().

      new Thread(new Runnable() { @Oviewride public void run() { 

    Acima do thread não é proprietário do bloqueio no object ConfirmationSynObj portanto, jogando IllegalMonitorStateException

    Use mais um bloco sincronizado dentro do método de run

      @Oviewride public void run() { synchronized (Config.ConfirmationSynObj) { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); Config.ConfirmationSynObj.notify(); } } }  @Oviewride public void run() { synchronized (Config.ConfirmationSynObj) { //this is a http request appSignInfo = getAPKSignature(context, pkinfo.packageName); Config.ConfirmationSynObj.notify(); } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.