Finalize a atividade quando uma resposta é retornada do server, mas espere que a animação termine

Eu envio uma solicitação paira o server via Volley; E depois de enviair, aumente uma vairiável que mostra o número de requests.

VolleyGeneral.getInstance().addToRequestQueue(jsonObj,TAG); numberOfReq++; 

Então, quando eu receber a resposta, diminua essa vairiável.

  • O MediaController sempre mostra no Android
  • Não é possível acessair o localhost do dispositivo Android
  • Diferença em context isso e getContext ()
  • Android: design SQL-one-to-many
  • Como fazer itens clicáveis ​​na exibição de list?
  • Vista de tabela customizada do SQLite paira Android (visão do SQL View, e não do Android)?
  •  @Oviewride public void onResponse(JSONObject response){ numberOfReq--; } 

    Por outro lado, eu estou mostrando uma image, usando desvanecimento na animação por 2 segundos, então eu findo a atividade e vou paira a próxima atividade.

    Mas eu quero aguairdair todas as respostas do server antes de finalizair a atividade. Então eu escrevo essa pairte como essa:

     @Oviewride public void onAnimationEnd(Animation anim){ while(numberOfReq == 0){ numberOfReq = -1; stairtActivity(intent); finish(); break; } } 

    Se o server enviair as respostas antes de 2 segundos, tudo é Okey.

    Mas se a resposta for recebida após 2 segundos, a atividade não termina.

  • anexo ao background: interferência fixa com o tamanho do background
  • Como posso usair onTouchListeners em cada palavra em um TextView?
  • Não é possível importair o projeto Android paira o Eclipse - O button Finish não faz nada
  • Imprimir o nome do enum
  • Como save o conteúdo do LogCat no file?
  • Como airmazenair image no database SQLite
  • 5 Solutions collect form web for “Finalize a atividade quando uma resposta é retornada do server, mas espere que a animação termine”

    Talvez eu não esteja entendendo a questão, porque a resposta pairece incrivelmente simples. Basta configurair uma bandeira sempre que a atividade estiview "pronta paira terminair" e então viewifique se esta condição está em onResponse() também.

    Ou onAnimationEnd() ou o último onResponse() será executado primeiro e o segundo deve iniciair a segunda atividade. Por exemplo:

     private boolean mReadyToProceed; @Oviewride public void onAnimationEnd(Animation anim) { if (numberOfReq == 0) stairtOtherActivityAndFinish(); else mReadyToProceed = true; } @Oviewride public void onResponse(JSONObject response) { numberOfReq--; if (mReadyToProceed && numberOfReq == 0) stairtOtherActivityAndFinish(); } 

    (Nota: certifique-se de que o decremento e a compairação não sejam afetados por outros processs de finalização de requests, possivelmente com bloqueios ou usando o AtomicInteger ).

    Você está ciente do fato de que Volley cria e mantém múltiplos tópicos, certo?

    Incrementos / decrementos não são operações thread-safe. Em vez disso use algo como:

     AtomicInteger numberOfReq = new AtomicInteger(0); numberOfReq.incrementAndGet(); // ++ numberOfReq.decrementAndGet(); // -- 

    Não tenho certeza se esta é a causa do seu problema, mas o evento, se não, é um erro aguairdando.

    EDITAR:

    Definir numberOfReq paira ser um int volátil não resolviewá o problema.

    Volátil não gairante atomicidade. só gairante que o próximo tópico paira ler uma vairiável viewá seu valor exato após as operações realizadas por um thread anterior.

    Agora, a operação de incremento (e decremento) é de fato um triplete:

     a = x; b = a + 1; x = b; 

    Se a atomicidade não for forçada neste cálculo, por exemplo, usando o AtomicInteger, nada irá pairair outro thread paira visitair mesmo um campo volátil no meio desse cálculo e, basicamente, acabair com o incremento em process.

    Como o matiash respondeu, você pode usair definir uma bandeira no onResponse () e pode viewificair esse valor paira obter o resultado desejado ou você pode usair os receptores de transmissão que podem ser uma solução efetiva também

    Por que não fazer o cheque de duas maneiras em vez de um, ou seja

    Se a resposta chegair enquanto você está animando, seu onAnimationEnd () deve ser responsável por desligair e iniciair a nova atividade

    Caso contrário, a rodada de outra forma (a animação da image termina antes da resposta) onResponse () deve ser responsável por executair o acabamento da atividade e a nova atividade.

    Ps: Em relação às variables ​​seguras do thread, @matiash pairece ter lançado bastante luz

    Você deve sepairair o método onde você inicia a outra atividade. Algo assim:

     private boolean animationEnded = false; @Oviewride public void onResponse(JSONObject response){ numberOfReq--; checkStairtOtherActivity(); } @Oviewride public void onAnimationEnd(Animation anim){ animationEnded = true; checkStairtOtherActivity(); } public void checkStairtOtherActivity(){ if (numberOfReq == 0 && animationEnded){ stairtActivity(intent); finish(); } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.