Pergunta

Eu admito, sou novo em toda essa coisa do Android. Estou tentando fazer um aplicativo, mas aleatoriamente recebo erros de perto e realmente não sei por quê. Meu aplicativo tem muitas atividades, nenhum deles termina () quando eu inicio um novo. Recebo dados da Web (via Web Services e Download de imagem direta) e uso muito o AsyncTask. Na maioria das vezes, ele trava na assíncada. Aqui está uma amostra de como eu faço as coisas:

private BackTask backTask;
Activity ctx = this;

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.trackslist);

        backTask = new BackTask();
            backTask.execute();
    }

    protected class BackTask extends AsyncTask<Context, String, myObject>
        {
            @Override
            protected myObject doInBackground(Context... params) 
            {
                 try{
                        if (hasInternet(ctx)==true)
                        {
                            //access the web SERVICE here
                        //initialize myObject WITH result FROM the web
                         return myObject
                       }
                       else
                       {
                            return null
                       }

                  }catch(Exception ex){
                       return null;
                }
            }

            @Override
            protected void onPreExecute()
            {
                    super.onPreExecute();
            }

            @Override
            protected void onProgressUpdate(String... values) 
            {
                    super.onProgressUpdate(values);
            }

            @Override
            protected void onCancelled()
            {
                    super.onCancelled();
            }

            @Override
            protected void onPostExecute( myObject result ) 
            {
                    super.onPostExecute(result);
                    if (result==null || result.isEmpty())
                    {
                           //no valid result, show a message
                    }
                    else
                    {
                        //result valid do something with it
                    }
            }
        }

     @Override
        public void onPause()
        {
            if (backTask!=null && ! backTask.isCancelled())
            {
                backTask.cancel(true);
            }
            super.onPause();
        }

    public void btnStartOnClick(View target) {
          Intent intent = new Intent(this, MyNewActivity.class); 
      startActivity(intent);
 }

Quando a atividade é OnPause (), a tarefa está sendo cancelada. Não tenho certeza do que acontece durante a tentativa/captura, se aparecer um erro, pelo que fiz, ele deve retornar nulo, mas acho que aqui sinto falta de alguma coisa. Como eu disse antes, aleatoriamente, chego uma força perto, mesmo que esteja em outra atividade. Isso é realmente frustrante, pois não posso oferecer um aplicativo que tenha esse comportamento. Então, o que estou fazendo de errado?

Foi útil?

Solução

Você precisa perguntar dentro do seu AsyncTask classe para isCancelled() E então decida o que fazer.

Verificar essa questão. Tem uma boa explicação de Romain Guy:

Você pode parar uma assínceta. Se você ligar para cancelar (true), uma interrupção será enviada para o encadeamento de segundo plano, o que pode ajudar a tarefas interrompíveis. Caso contrário, você deve simplesmente verificar o iscancelled () regularmente no seu método Doinbackground (). Você pode ver exemplos disso em code.google.com/p/shelves.

Outras dicas

Há um problema no seu código. Eu corrigi da seguinte maneira: você descobri que eu adicionei isto Ao chamar a tarefa assíncrona. Sua tarefa assíncrona aceita o contexto como argumento e você não estava passando isso.

public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.trackslist);

     backTask = new BackTask();
     backTask.execute(this);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top