2010-06-16 18 views
5

Konu sınıfını genişleten ve çalışma yöntemini bu şekilde uygulayan bir sınıfa sahibim.android thread management onPause

public void run(){ 
    while(!terminate){ 
     if(paused){ 
      Thread.yield(); 
     }else{ 
      accummulator++; 
     } 
    } 
} 

Bu iş parçacığı onCreate yönteminden üretilmiştir.

UI'm gizlendiğinde (Home tuşuna basıldığında), onPause yöntemim duraklatılan bayrağı true olarak ayarlayacak ve dişi yatıracaktır. Ancak DDMS'de, hala iş parçacığının zamanını ve durumunu "çalışıyor" olarak görüyorum.

Yani benim sorudur. İşlemciyi durdurmak için CPU zamanını kullanmamanın doğru yolu nedir?

cevap

4

Aslında, onPause'dan sonra bir iş parçacığının çalışmasını sağlamak kötü bir uygulamadır. Bunun nedeni, onPause uygulamasından sonra, uygulamanızın bilmeniz gerekmeksizin herhangi bir zamanda belleğinizin dışına çıkabilmesidir, bu nedenle kendiniz temizleyemezsiniz.

Bunu yapmanın doğru yolu, İpucunu açmayı durdurup Yeniden Oluşturma üzerine yeniden oluşturmaktır. Eğer devlete ihtiyacınız varsa, Android'in yerleşik saveState yöntemlerini veya ayarlarını kullanabilir ya da bunu saklamak için hangisini kullanabilirsiniz.

+0

Evet, bu benim de ortaya koyduğum sonuç. Ayrıca, en iyi uygulama yönteminin doğrudan Thread'den alt sınıf olarak değil, Runnable arayüzünü kullanması olduğunu düşünüyorum. Bu şekilde ipliği öldürebilir, ancak yine de başka bir iş parçacığı, durumu kaybetmeden, onu "devam ettirme" yeteneğine sahip olabilirsiniz. OnDestroy veya uygulama öldürdü ve yeniden olmadığını Verilen. –

0

paused değişkeniniz büyük olasılıkla önbellek yerel olarak önbelleğe alınmaktadır. Bunun nedeni sadece okunmanın ve döngüde değiştirilmemesidir. Öyleyse, derleyici/yorumlayıcı/jitter, sadece bir kez değişkeni okuyarak ve daha sonra sadece else şubesini yürüterek optimize eder. Döngü boyunca her yinelemenin okunması için pause değişkeninin volatile olarak işaretlenmesi gerekir. volatile anahtar kelimesinin documentation numaralı listesine bakın. İşte some info about threading ve some info about synchronization and concurrency.

+0

Duraklatılmış değişken kaynakları işgal etme konusunda çok fazla endişelenmiyorum. UI iş parçacığı durdurulmuş olsa bile iş parçacığı hala döngü olduğundan endişe duydum. –

+0

Neler olup bittiğini daha net açıklamak için cevabı güncelledim. Cevap duraklama değişkeni ve kaynakları ile ilgili değildi. İplik hala döngüdür, çünkü duraklatılmış değişken uçucu değildir ve tekrar okunmaz. Bu, çok iş parçacıklı programlamanın inceliklerinden biridir. – Qberticus

1

thread.yield() işlevini çağırıyor olsanız da, muhtemelen saniyede binlerce kez dönen bir while() döngüsü içerisindesiniz, her zaman .yield() çağrılıyor ancak bunun döngüden çıkıyor olması Kontrol, kaynakları kullanması anlamına gelir. Orada bir Log.d mesajını koyarsanız, ne demek istediğimi görürsünüz.

Thread.yield() yerine Thread.sleep() kullanılmasını öneririm. Nedeni, bir iplik uyurken, ortaya çıkar. Ayrıca uyku ile while()'u yavaşlatmak ve kaynakları kullanmamanın avantajını elde edersiniz. 500ms'lik bir uyku aralığı yeterli olmalıdır =)

+0

iş parçacığı sonunda bir Tuval üzerinde bir render iş parçacığı olarak kullanılacak ve mümkün olduğunca hızlı çalışmalıdır. Sanırım ipliği öldürmeyi ve onu, –

+0

Fuarında yeterli olan işleyicide yeniden yaratmayı deneyeceğim. Kodunuzdaki gibi kapalı döngüler CPU hogs olduğunu vurgulamak için değer. Bir mobil cihazda, bir cpu hog pili acele eder. –

+0

"Thread.yield" (aka 'Thread.sleep (0)') ve yüksek işlemci kullanımı ile ilgili bir sorun yaşamadım - iş parçacığı zamanlayıcısı, saniyede binlerce kez * çok aşağıda * şeklinde bir minimum ayrıntıya sahiptir. –

İlgili konular