Pergunta

Por exemplo, estamos em SomeActivity ea atividade tem um botão que invoca mover arquivos de um dir para outro (vamos chamá-lo de trabalho).

No BlackBerry eu faria:

  1. empurrar um (tela de diálogo) pop-up não-canceláveis ??dizendo "Por favor, aguarde ..."
  2. iniciar uma discussão que cumpre o trabalho
  3. na conclusão linha perto o pop-up

Esta abordagem 99,99% pode garantir que vamos ficar na mesma tela depois que a tarefa é longo, o usuário só vê o popup e aguarda a conclusão do trabalho. rotação do dispositivo ou o que não quebrar o fluxo de trabalho desejado.

No Android as coisas mudam. Eu sei que há o AsyncTask que, provavelmente, é fornecida para resolver o meu caso. Há ainda uma boa exemplo de como ele deve ser usado. Mas desde que não há nenhuma garantia de quanto tempo uma instância Atividade viverá a AsyncTask deve ser cancelado em onSaveInstanceState (e reiniciado em onRestoreInstanceState). Isso significa usar AsyncTask não há garantia de que somos capazes de cumprir plenamente o trabalho uma vez iniciada. Em alguns casos, como o envio de uma solicitação HTTP POST para a criação de um usuário Eu não gostaria de entrar em "usuário já existe para este login" problemas em reruning o AsyncTask. Isso é possível desde que o AsyncTask pode ser interrompido enquanto o pedido já é enviado (e o servidor, na verdade, está fazendo seu trabalho - a criação de um novo usuário)., Mas o AsyncTask é cancelada antes de chegarmos a resposta

Existe alguma solução no Android para obter o BB-como o comportamento dito acima?

Foi útil?

Solução 3

Em Maio de 2010 o Google lançou uma nova sessão IO chamado desenvolvimento de aplicativos cliente REST Android que explica como conseguir exatamente o que eu pedi.

Acontece que a questão é um pouco complicado, por isso não há fácil e rápida solução. A solução requer profundo conhecimento do Android plataforma / API. Este é o preço causada pela flexibilidade dos aplicativos ciclos de vida de processo / atividade.

Eu sinto alguma estranheza sobre o porquê de esta informação não foi apresentado desde a primeira versão do Android. Parece que o Google sabia escrever 100% aplicativos bugless e por algum motivo de marketing não partilharam abordagem. Imaginem quantos aplicativos de buggy foi escrito por Maio de 2010.

De qualquer forma estou feliz agora eu tenho smth que chamamos de abordagem de melhores práticas.

Outras dicas

Mas desde que não há nenhuma garantia de como tempo uma instância Atividade viverão o AsyncTask deve ser cancelado em onSaveInstanceState (e reiniciado em onRestoreInstanceState).

ou tê-lo ser gerido por uma Service.

Se a sua actividade quer ficar na tela, você pode simplesmente iniciar uma discussão como esta:

final File fromFile = ...;
final File toFile = ...;

new Thread() {
    @Override
    public void run() {
      // do something with fromFile, toFile
    }
}.start();

Dessa forma, o GUI-Thread está pronto para fazer outra pensa como exibindo uma

  android.app.ProgressDialog

Além disso, considere fazer o diálogo uncancellable com

  ProgressDialog.setCancelable(false);

Dessa forma, o usuário só pode sair através da HOME-chave, que você seja notificado de quando

  Activity.onPause()

é chamado. Futhermore que você pode querer olhar para Wakelocks, para parar a tela de virar preto e sua aplicação empurrou ao fundo onde ele poderia ser morto. Você faria isso no Tópico:

  PowerManager pm = (PowerManager) ivContext.getSystemService(Context.POWER_SERVICE);
  Wakelock wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp");
  wakeLock.acquire();

  // ... copy stuff ...

  wakeLock.release();

Claro que você teria que liberar o wakelock, também, quando as folhas do usuário por meio do Home-Key.

Finalmente, se você quiser chamá-GUI-Elementos do seu background-fio, isso só funcionará se o segmento faz parte da GUI-Event-Loop, como o fio normal é que você está correndo, quando sendo chamado com on ...-Métodos. Para alcançar este o seu fundo-thread terá de chamada de retorno para o GUI-Thread através de um Handler. Como esta:

  private Handler mHandler = new Handler() { 
      @Override
      public void handleMessage(Message msg) {
          Log.v(TAG, "Got Message "+msg.what); // prints: Got Message 77
      // ... do GUI actions ...
      }    
  };

  // ... in Thread ...

  int lvInfo = 77;
  mHandler.sendEmptyMessage(lvInfo);

Você pode até mesmo colocar objetos na mensagem assim:

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top