2016-07-16 9 views
0

Ich habe eine AsyncTask, die einen Webservice aufruft und ein JSON-Objekt daraus abruft. Ich möchte eine Zeitüberschreitung für diese Aufgabe festlegen, so dass die AsyncTask abgebrochen wird, wenn etwas schief geht (z. B. wenn die Internetverbindung unterbrochen wird oder usw.). mein Code hier so weit ist:AsyncTask ruft 'onCancelled' nicht sofort auf, wenn AsyncTask.cancel (true) in android aufgerufen wird

@Override 
protected void onStart() { 
final GetRequestsTask requestTask = new GetRequestsTask(); 
requestTask.execute(createUrl()); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Log.d("myapp", "entered handler"); 
      if (requestTask.getStatus() == AsyncTask.Status.RUNNING) { 
       Log.d("myapp", "entered cancelling"); 
       requestTask.cancel(true); 
      } 
     } 
}, TIME_OUT); 
} 

Das Problem, das ist, wenn die handler erreicht „eingegeben Cancelling“ Punkt und sendet das Signal an die AsyncTask abbrechen, wird es nicht abbrechen und rufen onCancelled() sofort (es wird nach 10 Sekunden oder so, wenn überhaupt) genannt

Meine GetRequestTask ist linear, was bedeutet, dass es nicht eine Schleife im Innern hat, so kann ich nicht manuell in der doInBackground() Methode für isCancelled() überprüfen.

Was empfehlen Sie mir zu tun?

Antwort

1

Von this question:

Wenn Sie Berechnungen tun:

  • Sie haben regelmäßig isCancelled() zu überprüfen.

Wenn Sie eine HTTP-Anforderung tun:

  • Speichern Sie die Instanz Ihrer HttpGet oder Httppost irgendwo (zB ein öffentlicher Bereich.).
  • Rufen Sie nach dem Aufruf von cancel request.abort() auf. Dies führt dazu, dass IOException in Ihr doInBackground geworfen wird.

Zusätzlich, wenn Sie einige Bibliothek verwenden bequem Anfragen zur Verfügung zu stellen, dann denke ich, es sollte eine gewisse cance() Methode haben. Zum Beispiel für retrofit there is such method.

Also in diesem Fall wie für 'Wenn Sie eine HTTP-Anfrage machen' Abschnitt. Sie müssen:

  • Speichern Sie die Instanz Ihrer Anfrage (für die Nachrüstung es ist Call)
  • Nach Abbrechen anrufen, wählen Sie für gespeicherte Instanz request ‚Abbrechen‘ Methode.

Und eine weitere Alternative ist rxJava. Mit Hilfe dieser Bibliothek können Sie Observable für Ihre Anfrage erstellen und eine Referenz auf ihre Subsribition speichern. Dann müssen Sie nur SavedSubscription.unsibscribe() aufrufen und das war's.

Verwandte Themen