Domanda

Lo ammetto, io sono nuovo a questo roba tutta Android. Sto cercando di fare un app, ma in modo casuale ricevo forza chiudere gli errori e io davvero non so perché. La mia applicazione ha molte attività, nessuno di loro finire () quando inizio una nuova. Ottengo i dati dal web (tramite servizi Web e il download diretto dell'immagine) e io uso AsyncTask molto. Il più delle volte si blocca sul AsyncTask. Ecco un esempio di come faccio le cose:

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 l'attività ottiene onPause () il compito è stato annullato. Non sono sicuro di ciò che accade durante il try / catch se un errore appare, da quello che ho fatto, deve restituire nulla, ma penso che qui mi manca qualcosa. Come ho detto prima, casualmente ho una forza vicina anche se sono in un'altra attività. Questo è davvero frustrante come non posso offrire un app che ha questo comportamento. Allora, che cosa sto sbagliando?

È stato utile?

Soluzione

Hai bisogno di chiedere all'interno della vostra classe AsyncTask per isCancelled() e poi decidere cosa fare.

questa domanda . Ha una buona spiegazione di Romain Guy:

  

È possibile interrompere un AsyncTask. Se si chiama   cancellare (true), un interrupt sarà   inviato al filo di fondo, che   può aiutare le attività interrompibili.   In caso contrario, si dovrebbe semplicemente fare in modo   per controllare isCancelled () regolarmente   il metodo doInBackground (). Puoi   vedere esempi di questo a   code.google.com/p/shelves.

Altri suggerimenti

Non c'è problema nel codice. Ho corretto in questo modo: trovare Ho aggiunto questo durante la chiamata operazione asincrona. Il vostro compito asincrona accetta contesto come argomento e non si passava così.

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

     backTask = new BackTask();
     backTask.execute(this);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top