Android Perché il mio app Force vicino?
-
26-09-2019 - |
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?
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);
}