2011-10-19 20 views

cevap

87

etkinlik içinde asyncTask beyan: Böyle

private YourAsyncTask mTask; 

örneğini it:

mTask = new YourAsyncTask().execute(); 

öldürme/şöyle iptal:

mTask.cancel(true); 
+2

Bunu böyle kullandıktan sonra YourAsynchTask mTask = new YourAsncTask(); mTask.execute(); çalıştı. Güzel. – Senthil

+3

Bu tür bir sinir bozucu olsa da, örneğin tek bir işleminiz varsa (örneğin bir veritabanı sorgusu gibi) gerçekten iptal edemezsiniz. Sorgu uzun bir zaman alır ve sadece bir çağrı ise, o zaman iptal etmek için bir yolu yok gibi görünüyor:/ – AgentKnopf

+0

Eğer AsyncTask içinde bir şey yapıyorsanız (bir döngü) o zaman isCancelled() kontrol etmek isteyebilirsiniz -) https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar

21

İşlerin sizin için durmuyor olmasının nedeni, işlemin (doInBackground()) bitene kadar devam etmesidir. evre iptal değilse atlayın aksi takdirde bunu, Yani temelde

if(!isCancelled()){ 
// Do your stuff 
} 

:) bunun için bazı kere kontrol etmek yararlı olabilir: iplik iptal edilir veya olmasın şeyler yapmadan önce nedenle kontrol etmelidir Operasyon sırasında, özellikle zaman ayırmadan önce. Ayrıca

o AsyncTask için

onCancelled(); 

Dokümanlarından alittle "temizlemek" için yararlı olabilir: Bu yardımcı olur

http://developer.android.com/reference/android/os/AsyncTask.html

Umut!

+0

Eğer bir parametre olarak doğru şekilde iletirseniz, o zaman arka plan görevinde duracaktır. Yani bu yalnızca 'task.cancel (boolean) 'false' –

1

Benzer bir sorunum vardı - kullanıcı parçayı yok ettikten sonra asenkron bir görevde NPE alıyordum. Yığın taşması sorun üzerinde araştırma sonra ben aşağıdaki çözümü kabul: Sonra

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

diye kontrol periyodik benim zaman uyumsuz kodunda "çalışan ise". Bunu stres testi yaptım ve şu an aktivitemi "kırmam". Bu mükemmel çalışır ve SO üzerinde gördüğüm bazı çözümlerden daha basit olmanın avantajına sahiptir.

6

Asenkronizasyonu hemen öldüremezsiniz. Zaten iptal eğer asynctask en doInBackground() yöntemi kontrol altında

task.cancel(true); 

ve daha:

isCancelled() 

ve öyleyse, elle yürütme durdurma durdurmak amacıyla ilk önce iptal edilmelidir .

-4

u bir kez daha sonra) onCancelled (kontrol edebilirsiniz:

korumalı nesne doInBackground (Object ...Ayrıca veya Activity Yaşam Döngüsü onDestroy kullanmak gerekebilir

+0

içine iletirseniz yararlı olur. Bu başka bir iş parçacığından AsyncTask'ı iptal etmeyle ilgili değildir. – QMaster

9

x) {

while (/* condition */) { 
    if (isCancelled()) break; 
} 
return null; 

}:

//you may call the cancel() method but if it is not handled in doInBackground() method 
if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED) 
    loginTask.cancel(true); 

loginTask sizin AsyncTask

Thank amacı sen.

+0

Tam olarak bunun için buraya geldim! – winklerrr