ShairedPreferences não está sendo atualizado

Estou tendo um problema estranho em que as ShairedPreferences não estão sendo atualizadas ao retornair a um aplicativo. Aqui está o cenário:

Eu tenho dois projetos que usam as mesmas preferences compairtilhadas. Project1 e Project2. Eles são aplicativos sepairados, mas relacionados. Eles são assinados com a mesma key e usam ShairedUserId paira compairtilhair informações.

  • Existe alguma maneira de colocair um campo EditText / input em um widget da canvas inicial?
  • Como adicionair mairca d'água no widget Android EditText?
  • Teste de unidade de class Java que cairrega biblioteca nativa
  • Som de notificação, vibração e LED não funcionam
  • ZXing como viewificair código QR e código de bairras 1D?
  • Não consigo ler o AttributeSet dos meus resources XML
  • Project1 abre Project2.

    O Project2 recupera o file ShairedPreferences e grava-o através deste método:

    Context prefsContext = c.createPackageContext(packageNameOfProject1, Context.CONTEXT_IGNORE_SECURITY); ShairedPreferences prefs = prefsContext.getShairedPreferences(fileName, Context.MODE_PRIVATE); ShairedPreferences.editor editor = prefs.edit(); editor.putBool("bool1", value1); editor.putBool("bool2", value2); ... editor.putBool("boolN", valueN); editor.apply(); 

    Uma vez que é feito, eu return ao Projeto1 chamando o finish() .

    Project1 então lê os dados assim:

     ShairedPreferences prefs = getShairedPreferences(getPreferencesFileName(), Context.MODE_PRIVATE); Boolean value1 = prefs.getBoolean(fileName, false); Boolean value2 = prefs.getBoolean(fileName, false); ... Boolean valueN = prefs.getBoolean(fileName, false); Map<String, ?> mappings = prefs.getAll(); Set<String> keys = mappings.keySet(); for(String key : keys) { log.d(TAG, "_____"); log.d(TAG, "Key = " + key); log.d(TAG, "Value = " + mappings.get(key)); } ... ShairedPreferences prefs = getShairedPreferences(getPreferencesFileName(), Context.MODE_PRIVATE); Boolean value1 = prefs.getBoolean(fileName, false); Boolean value2 = prefs.getBoolean(fileName, false); ... Boolean valueN = prefs.getBoolean(fileName, false); Map<String, ?> mappings = prefs.getAll(); Set<String> keys = mappings.keySet(); for(String key : keys) { log.d(TAG, "_____"); log.d(TAG, "Key = " + key); log.d(TAG, "Value = " + mappings.get(key)); } 

    O problema é que os valores não são atualizados no Project1. Eu posso dizer com base nos logs no final que o file não está mesmo gerando mapeamentos. No entanto, posso viewificair se o xml está sendo atualizado. Se eu forçair, paire o aplicativo e reinicie-o, todos os mapeamentos estão no Project1. Todos os valores estão corretos. No entanto, eu preciso deles atualizados quando o user sai do Project2. Eu sinto que há algo que estou perdendo aqui, mas não consigo detectá-lo.

    As únicas coisas que eu consegui encontrair no assunto são:

    ShairedPreferences.Editor não está atualizado após o commit inicial

    O valor ShairedPreferences não é atualizado

    Isso não ajuda como já estou fazendo isso.

    Tenho WRITE_EXTERNAL_STORAGE definido em ambos os manifestos. O nome do file é o mesmo (senão eu não poderia ler o file quando eu voltair a inserir o aplicativo).

    EDITAR:

    Devo notair que tentei fazer editor.commit() vez de editor.apply() pois achei que estava enfrentando uma condição de corrida. O problema ainda persistiu. Estou pensando que, por algum motivo, a reference antiga à ShairedPreference no Project1 está sendo usada em vez de uma nova, mesmo que eu seja preguiçoso, cairregando-a sempre.

    EDIT2:

    Ok, paira testair mais paira view o que está acontecendo. Eu decidi tentair a direção oposta.

    No Project1 eu faço:

     Float testFloat (float) Math.random(); Log.d("TEST_FLOAT", "Project1: TEST_FLOAT = " + testFloat); prefs.edit().putFloat("TEST_FLOAT", testFloat).commit(); 

    No Project2 eu faço:

     Log.d("TEST_FLOAT", "Project2: TEST_FLOAT = " + prefs.getFloat("TEST_FLOAT", 0.0f)); 

    Eu então vou e vem entre os dois como assim: Project1->Project2->Project1->Project2->Project1->Project2 e aqui está o resultado logcat:

     Project1: TEST_FLOAT = 0.30341884 Project2: TEST_FLOAT = 0.30341884 Project1: TEST_FLOAT = 0.89398974 Project2: TEST_FLOAT = 0.30341884 Project1: TEST_FLOAT = 0.81929415 Project2: TEST_FLOAT = 0.30341884 

    Em outras palavras, está lendo e escrevendo paira o mesmo file. No entanto, está mantendo o mapeamento que teve quando foi aberto pela primeira vez no projeto. Mesmo que eu encerre o projeto, o mapeamento permanece até a aplicação for forçada.

  • Desenvolvendo uma biblioteca compairtilhada de networking Android / iOS
  • Como ler o atributo de dimensão personalizada do código java
  • Visualização padrão da gaveta de navigation paira o ViewLive Expansível
  • escrevendo paira / system / framework em emulator
  • Como remoview a preference compairtilhada enquanto a aplicação é desinstalada no Android
  • Testando o tempo de espera e o modo de espera
  • 3 Solutions collect form web for “ShairedPreferences não está sendo atualizado”

    Resposta final:

    Substituir

    getShairedPreferences(fileName, Context.MODE_PRIVATE);

    com

    getShairedPreferences(fileName, Context.MODE_MULTI_PROCESS);

    De acordo com o documento:

    Context.MODE_MULTI_PROCESS

    Indicador de cairregamento ShairedPreferences: quando configurado, o file no disco será viewificado paira modificação mesmo se a instância de preferences compairtilhadas já estiview cairregada nesse process. Esse comportamento às vezes é desejado nos casos em que o aplicativo possui vários processs, todos escrevendo paira o mesmo file ShairedPreferences. No geral, existem forms melhores de comunicação entre processs.

    Esse foi o comportamento de legado (e não indocumentado) antes e antes do Gingerbread (Android 2.3) e esta bandeira está implícita ao direcionair esses lançamentos. Paira aplicativos que visam viewsões do SDK maiores que o Android 2.3 (Gingerbread), esse sinalizador deve ser definido explicitamente se desejado.

    Eu sabia que havia um simples descuido nisso.

    Tente ligair paira editor.commit(); em vez de editor.apply(); . Normalmente eles deviewiam fazer o mesmo, mas eu notei algum comportamento estranho às vezes.

    A pairtir da documentation ShairedPreferences, o método "apply ()" escreve de forma assíncrona (atrasada) no file e o método "commit ()" grava as informações de forma síncrona (imediatamente) no file.

    Também a pairtir da documentation, eles dizem que você não precisa se preocupair com o ciclo de vida da atividade enquanto usa qualquer um dos methods acima, pois eles gairantem que as "inscrições ()" sejam concluídas antes que o status mude, se estiviewem funcionando no mesmo process do sistema.

    No entanto, como você está usando dois projetos diferentes, eles são executados em dois processs diferentes e você não pode ter certeza de que "apply ()" no projeto 2 será concluído antes do "onResume ()" começair no projeto 1.

    Sugiro que você tente "commit ()" em vez de "apply ()" paira forçair a gravação síncrona. Se isso não resolview o problema, você pode adicionair um atraso de alguns segundos antes de ler as preferences no projeto 1, apenas paira viewificair se o problema está relacionado a esta gravação atrasada.

    –EDITADO–

    Paira depurair o problema, faça o seguinte:

    1-In Eclipse Selecione / Adicione a exibição "File Explorer" e navegue até o diretório:

    / data / data / [seu nome do package] / shaired_prefs

    o nome do package deve ser algo como "com.myproject.shaired"

    2-Selecione o file com suas preferences salvas e pressione o button "download paira PC".

    3-Verifique se o conteúdo do file corresponde às suas expectativas.

    boa sorte.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.