2016-08-08 45 views
1

Ich betreibe eine AsyncTask und es dauert ein wenig Zeit zu laden. Wenn ich in dieser Zeit die Taste zurück drücke, reagiert sie nicht. Es reagiert erst nach ein paar Sekunden. Also, wie kann ich AsyncTask töten oder pausieren oder außer Kraft setzen, um zurückzugehen? Oder gibt es einen anderen Weg, etwas Ähnliches zu tun?Wie kann ich asynctask in Android stoppen, wenn die Zurück-Taste gedrückt wird?

if (mainContent != null) { 
    mainContent.post(new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bmp = Utilities.getBitmapFromView(mainContent); 
      BlurFilter blurFilter = new BlurFilter(); 
      Bitmap blurredBitmap = blurFilter.fastblur(bmp,1,65); 
      asyncTask = new ConvertViews(blurredBitmap); 
      asyncTask.execute(); 
     } 
    }); 

Mein AsyncTask:

class ConvertViews extends AsyncTask<Void,Void,Void> { 
     private Bitmap bmp; 

     public ConvertViews(Bitmap bmp){ 
      this.bmp = bmp; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       //Thread.sleep(200); 
       if(mainViewDrawable == null) { 
        mainViewDrawable = new BitmapDrawable(getResources(), bmp); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 

Mein onBackPressed():

public void onBackPressed() { 
    super.onBackPressed(); 
    asyncTask.cancel(true); 
    finish(); 
} 
+0

Geben Sie Ihren Code ein? –

+0

Ich bin neu auf dieser Plattform. Können Sie mir sagen, wie ich den Code veröffentlichen kann? Es zeigt Fehler beim Posten an. –

+0

Kopieren Sie den Code und fügen Sie ihn in das Bearbeitungsfeld ein, wählen Sie den gesamten Code im Bearbeitungsfeld aus und drücken Sie Strg + K, um ihn zu formatieren. Dann reiche es ein. –

Antwort

2

gibt es keine Möglichkeit, dass Sie eine asynch task instantly .Every AsynchTask ein boolean flag property mit ihm verbunden hat stoppen kann also, wenn cancel_flag =True Mittelwert Aufgabe wurde abgebrochen und es gibt eine cancel() Funktion, die auf einer 01 aufgerufen werden kannwie diese

loginTask.cancel(true);

aber all diese cancel() Funktion nicht ist, wird es eine boolean(flag) Eigenschaft asynch Aufgabe True so setzen rückgängig, diese Eigenschaft mit isCancelled() Funktion innerhalb doInBackGround und etwas tun, zu überprüfen, wie

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 

und wenn es wahr ist, dann können Sie verwenden break the loops (wenn Sie eine lange Aufgabe tun) oder return schnell aus doInBackground und Anruf gehen Ing cancel() on asynchtask wird die Ausführung von onPostExecute() überspringen. Wenn Sie mehrere laufende asynch-Aufgaben im Hintergrund stoppen wollen, dann kann das Aufrufen von Cancel bei jedem einzelnen mühsam sein. In diesem Fall können Sie ein boolesches Flag in container class(of asynchtask) haben und das Arbeiten innerhalb von asyntask überspringen, wenn der Befehl ausgeführt wird Flagge wurde auf True gesetzt, wie

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (container_asynch_running_flag) break; 
    } 
    return null; 
} 

aber stellen sie sicher, dass auch in onpostExecute in diesem Fall eine Prüfung setzen, weil es nicht die Ausführung von onpost zu stoppen.

0

Sie können sofort aufhören asyncTask.cancel(true) aufrufen.

Es wird jedoch nicht empfohlen, da dies zu Speicherlecks führen kann. Rufen Sie besser asyncTask.cancel(false) an und beenden Sie die Funktion doInBackground manuell, indem Sie den Wert isCancelled() wie von @Pavneet empfohlen überprüfen.