2010-11-24 4 views

Antwort

2

Verwenden Sie die AsyncTask.cancel(true) Methode.

+0

Das sieht vielversprechend aus. Und, kann ich postDelayed verwenden, um meine AsyncTask nach 5 Sekunden abzubrechen? Vielen Dank. – bobetko

0

Entschuldigung, dass Sie hier nicht klar sind. Hier ist das Beispiel, das ich für synchronen Thread habe. Meine Funktion listen() wird für 5 Sekunden ausgeführt und dann beendet. Listen() ist ein UDP-Listener ...

Problem Ich habe mit diesem Code, es stoppt mein Haupt-Thread (mein Telefon wurde nicht mehr reagiert), bis aufgeführt() beendet seine 5 Sekunden laufen. Ich möchte asynchronen Thread verwenden, um zu vermeiden, dass mein Telefon einfriert. Als ich sagte, dass ich mit der Zeit nichts anfangen kann, versuchte ich zu sagen, dass ich keine Art von Timer in die listen() -Funktion setzen kann, dann die verstrichene Zeit messe und dann nach 5 Sekunden beende. Kann das nicht tun.

Thread t = new Thread() { 
    public void run() { 
     try { 
      listen(); 
     } catch (IOException e) { 
      Log.d(TAG, "IOException (Discovery) " + e); 
      e.printStackTrace(); 
     } 
     synchronized (this) { 
      notifyAll(); 
     } 
    } 
}; 
synchronized (t) { 
    t.start(); 
    try { 
     t.join(5000); // 5 sec 

    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+1

Setup 'AsyncTask' und führen Sie diesen Code innerhalb seiner' doInBackground() 'Methode. –

+0

Danke. Werde das versuchen. – bobetko

+0

Funktioniert gut .... – bobetko

3

Threading in Java ist kooperativ - Sie können nicht gewaltsam einen Thread stoppen. Was Sie tun können, ist es zu stoppen (Aufruf Interrupt() oder eine Flagge zu heben) und dann der Code willig stoppt.

So:

  1. Starten Sie Ihren Worker-Thread ausgeführt wird. Drinnen wiederholt es (innerhalb der Hauptarbeitsschleife) nach isInterrupted() suchen UND irgendeine InterruptedExceptions fangen - den Faden in diesem Fall verlassen.

  2. Starten Sie eine TimerTask, die 5 Sekunden lang ausgeführt wird, und rufen Sie anschließend interrupt() im Worker-Thread auf.

Update: Plakat erklärt, dass er bereits einen funktionierenden Code zu haben, er muss nur asynchron auszuführen, ohne UI blockiert.

Lösung: Setup AsyncTask und führen Sie Ihren Code innerhalb es ist doInBackground() Methode.

Verwandte Themen