iplik

2010-09-14 7 views
17

Ben onStart bazı şeyler yapmak için bir iş parçacığı başlatmak için benim Hizmetin() işleyicisi kodu olduğunu varsayalım çalışan ve daha sonra() stopSelf çağrı iken Servisi stopSelf() çağrılıyor.iplik

stopSelf() iplik bitmeden çağrılır. Tam olarak ne var?

Kendimi bu test ettik ve benim iş parçacığı bitene kadar çalışmaya devam eder. Android, stopSelf() çağrısını duyuyor mu, ancak iş parçacığı bitene kadar erteliyor mu?

@Override 
public void onStart(Intent intent, int startid) { 
    new Thread(new Runnable() { 
     public void run() { 
     // TODO some long running operation 
     } 
    }).start(); 
    stopSelf(); 
} 
+1

Lütfen kodun küçük bir kısmını bile gönderin ... – Kiril

+1

bile bu küçük kod sayesinde çok fazla iş parçacığı sayesinde yürütme sırasını açık bir şekilde uygulayamazsınız, çünkü kabul edilen yanıtta belirtildiği gibi: hizmete. – Kiril

+0

Konuları başlatmak için 'onStart' yerine' onStartCommand' kullanılmıyor mu? –

cevap

21

stopSelf() iplik bitmeden çağrılır. Tam olarak ne var?

iplik tamamlanması için çalışır.

Android, stopSelf() çağrısını duyuyor, ancak iş parçacığı bitene kadar erteliyor mu?

sayılı Sizin Service hala stopSelf() çağrısının noktasında yok edilir. Bir iş parçacığı ve Service nesnesini, en azından iş parçacığı sonlanıncaya kadar sızdırıyorsunuz.

Bunu background-parçacığı ve- stopSelf() desen entegre olarak, IntentService geçiş düşünebilirsiniz.

+2

Yani, bunu doğru olarak anlarsam, bir IntentService, bir iş parçacığında onHandleIntent içindeki kodu yürütür; bu yüzden kodumla iş parçacığı yapmaya gerek yok. Ayrıca, kod bittiğinde IntentService kendini öldürür. IntentService'ye başka bir Niyet iletilirse, yürütme bittiğinde bu Niyeti işleyecektir. Hepsi bittiğinde, kendini öldürür. IntentService dışında, tek ihtiyacım olan şey niyetim ile startService'i aramak. Evet? – Andrew

+0

Bir Niyeti kuyruğun önüne zorlamanın bir yolu var mı? Bu eylemleri sıraya koymak çoğu zaman iyidir, ancak IntentService'in verileri çekmek için bir web hizmetine çarpmasını istiyorum. Sıradaki herşeyi atlatıp hemen gerçekleşmesini istiyorum. UI iş parçacığı donmuş olmayabilir, ancak kullanıcı hala bu verileri bekliyor. – Andrew

+2

@Andrew: "Evet?" -- Evet. "Bir Niyet'i sıranın önüne itmenin bir yolu var mı?" - Bildiğim kadarıyla değil, ancak bir şekilde bir "PriorityQueue" ile kuyruğu değiştirebilirsiniz. IIRC, "IntentService" çok büyük bir sınıf değil, bu nedenle ihtiyaçlarınızı karşılamak için kuyruk uygulamasını ayarlamak için klonlayabilirsiniz. Benim deneyimden – CommonsWare

1

Eğer iplik içinden stopself() çağırırsanız. Hizmetin durmasını istediğinizde iş parçacığınızın herhangi bir noktasında stopSelf() öğesini çağırabilirsiniz. Ancak o zaman bile iş parçacığı çalışmaya devam edecek. İş parçacığı tamamlandığında hizmetin durmasını istiyorsanız, iş parçanızın son satırında stopSelf() öğesini çağırın.

+0

bir iş parçacığı içinde stopSelf() çağırırken bir hizmet durdurulmaz (Android 4.2.2). Bir Asynctask'i daha iyi kullanın ve onCanceled veya onPostExecute'ta stopSelf'i arayın. –