Pergunta

Ei pessoal, tenho um problema com a caixa de diálogo de progresso na abertura de uma atividade (chamada Atividade 2 no exemplo). A Atividade 2 tem muito código para executar neste evento OnCreate.

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true);
new Thread() {
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showApps();
            }
        });
        myProgressDialog.dismiss();
    }
}.start(); 

A atividade de lançamento da função Showapps 2.

Se eu executar esse código no meu evento de clique em Button na Atividade 1, vejo o progresso, mas ela não se move e afeter, tenho uma tela preta durante 2 ou 3 segundos, o tempo para o Android mostrar a atividade.

Se eu executar esse código no OnCreate of Activity2 e se eu substituir o Showapps pelo código no OnCreate, o Atividade1 congelou 2 segundos, não vejo a caixa de diálogo Progresso e congelar novamente 2 segundos na Atividade 2 antes de ver o resultado.

Uma ideia ?

Foi útil?

Solução

Eu tive o mesmo problema e usando um ASYNCTASK está trabalhando para mim.

Existem 3 métodos importantes a serem substituídos na assíncada.

  1. Doinbackground : É aqui que ocorrerá a carne do seu processamento de fundo.
  2. OnPreexecute : mostre seu progressodialog aqui (showdialog)
  3. OnPostexecute : Oculte seu progressodialog aqui (removedialog ou DismissDialog)

Se você fizer sua subclasse de assíncrogem como uma classe interna de sua atividade, poderá chamar os métodos da estrutura ShowDialog, Dismissdialog e removedialog de dentro da sua atividade assíncrica.

Aqui está uma amostra de implementação de assínctase:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
  @Override
  protected Boolean doInBackground(String... params) {
    try {
      Thread.sleep(4000);  // Do your real work here
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return Boolean.TRUE;   // Return your real result here
  }
  @Override
  protected void onPreExecute() {
    showDialog(AUTHORIZING_DIALOG);
  }
  @Override
  protected void onPostExecute(Boolean result) {
    // result is the value returned from doInBackground
    removeDialog(AUTHORIZING_DIALOG);
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
    startActivity(i);
  }
}

Outras dicas

AFAIK Você não pode pré -carregar nenhuma atividade com diálogo de progresso exibido. Você está testando em um dispositivo real ou em emulador?

Vi soluções alternativas que abriram uma atividade com um visualizador tendo uma animação de progresso no centro e, na próxima visualização, ela foi carregada uma atividade, mas não é algo recomendado e difícil de implementar para trabalhar como você deseja.

Geexor

Eu sugiro que você evite a execução de muitas operações no OnCreate da Atividade 2. Escritando muitas operações no OnCreate é uma razão para a tela preta entre atividades. Então, execute essas operações de forma assíncrona usando ASYNCTASK ou em um tópico (ou escreva -os em OnStart se eles são inevitáveis).

A outra sugestão é iniciar outro ProgressDialog no OnCreate da Atividade 2, que será executado até que todos os seus dados sejam carregados e o usuário saberá que algo está acontecendo em segundo plano.

É isso que eu faria. Crie um manipulador no thread da interface do usuário, inicie o encadeamento de processamento em segundo plano e mostre o ProgressDialog. Quando o encadeamento de segundo plano terminar, o trabalho é publicar um runnable no thread da interface do usuário através do manipulador para descartar a caixa de diálogo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top