2012-01-18 19 views
9

Her zaman iki işleyici oluşturur: biri ana iş parçacığına sarılırken, diğeri tek bir iş parçacığı üzerinde sarılır.Handlerthread'i durdurmak için bu en iyi yol mu?

Bunlar, bir Etkinlik yaşam döngüsünde bunları başlatmak ve durdurmak için en iyi yöntem midir?

HandlerThread safeThread = null; 
Handler safeHandler = null; 
Handler handler = null; 


@Override 
    public void onStart() { 

if (safeThread == null) { 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.NEW) { 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.WAITING) { 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.TERMINATED) { 
      safeThread = null; 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } 
} 




protected void onStop() { 
     Log.d("x", "onStop is executed"); 
     safeHandler = null; 
     safeThread.quit(); 
     safeThread.interrupt(); 
     safeThread = null; 
     super.onStop(); 
    } 
Sen konuları durdurmak için güvenli bir yol olarak kullanabilirsiniz
+0

safeThread.interrupt(); iş parçacığı – Sameer

+0

durdurmak için en iyi yoldur, biliyorum, ama bunu düşündüğümde, bu kesildikten sonra bu güvenlidir. – rex

+1

ben bir cevap verdim .. ben birileri yardım etmek istiyorum sonra onu bir oy vermek istiyorum ve cevabın en iyisi olduğunu düşünüyorsanız cevap olarak işaret istiyorum stackoverflow.IF yeni olarak size tavsiye ederim bir şey .. :) hoşgeldiniz ve Beğeniler – Sameer

cevap

0

: Ben biraz eski bir soru biliyorum

if (safeThread!= null) { 
    Thread moribund = safeThread; 
    safeThread = null; 
    moribund.interrupt(); 
} 
+1

Daha fazla ayrıntı için bu http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class – Sameer

+0

daha fazla ayrıntıyı açıklayabilir misiniz? sebep ne ?? – rex

+0

Nedeni için yukarıdaki yorumda soruya bakın – Sameer

15

, ama ben don araştırma ayrıca aynı cevap arayan ve rastlarsanız' Şu anki cevabın HandlerThread uygulamasına çok iyi uygulandığına inanıyoruz (normal iş parçacıkları için kesinlikle doğru olmasına rağmen)

İşleyicide, iş parçacığını durdurmak için bir quit() ve quitSafely (API18) yöntemleri bulunmaktadır. https://developer.android.com/reference/android/os/HandlerThread.html#quit()

İki arasındaki fark, yalnızca sıradaki iletiler durmadan veya durdurulmadan işlenecekse geçerlidir.

safeThread.quit(); 
+0

Netlik eklemek için: quit() API 5 – Vyrx

+2

kullanılabilir 18 api öncesi ne yapmalı? – JohnyTex

+0

quit() veya quitSafely() işlevi iş parçacığı mı yoksa yalnızca iş parçacığı iletileri işlemek için gereken Looper durur mu? İş parçacığının sonlanıp bitmediğini açıklamıyor [burada] (https://developer.android.com/reference/android/os/HandlerThread.html#quit()). – Thracian

8

böyle parçacığı başlatırsanız: durdurmak için

HandlerThread thread = new HandlerThread("MyHandlerThread"); 
thread.start(); 

güvenli yolu olurdu: olarak

yüzden cevap, bu kadar basit

thread.quitSafely(); 

quitSafely tüm bekleyen iletilerin iş parçacığı öncesinde işlenmesini sağlar durur.

Not: My orijinal cevap Thread.Join için ek bir çağrı dahil ama quitSafely sonra kullanıldığında çağrı güvenilir salmayan katılmak bulundu.

+0

Ayrıca quitSafely'den sonra katılmam gerekip gerekmediğini merak ediyorum. "Güvenle serbest bırakmaz" açıklayabilir misiniz? Teşekkürler! – Kaifei

+0

@Kaifei Hatırlıyorum Birleştirme çağrısının sadece iş parçacığını engellediğini gözlemledim. Ağustos ayında geri döndü, bu yüzden% 100 emin değil. – SharkAlley

İlgili konular