2012-03-09 13 views
5

Android Uygulama geliştirme konusunda yeniyim ve Async görevleri ile ilgili bir sorun yaşıyordum. Grafik oluşturma sırasında bazı arka plan işleme yapan bir EKG grafik uygulaması oluşturmaya çalışıyorum.Android Async görevi benim UI yavaşlatıyor Konu

aşağıdaki zaman uyumsuz görev tanımladığınız

- (i UI güncelleştirmek ihtiyacım yok -

private class Erosion extends AsyncTask <Void,Void,Void> { 


    @Override 
    protected Void doInBackground(Void...unused) { 

     int i,tempIndex; 
     double[] tempArray = new double[13]; 
     double min = ecgSamples[ecgSampleForErosionIndex] - gArray[0]; 
     while (ecgIncoming) 
     { 
      if (ecgSampleForErosionIndex > 179999) 
      { 
       ecgSampleForErosionIndex = 0; 
      } 

      for(i= 0;i<13;i++) 
      { 
       tempIndex = ecgSampleForErosionIndex + i; 
       if (tempIndex > 179999) 
       { 
        tempIndex = (ecgSampleForErosionIndex + i) - 180000; 
       } 
       tempArray[i] = ecgSamples[tempIndex] - gArray[i]; 
       if (tempArray[i] < min) 
       { 
        min = tempArray[i]; 
       } 

      } 

      //min needs to be stored in the erosionFirst Array 

      if (erosionFirstArrayIndex > 179999) 
      { 
       erosionFirstArrayIndex = 0; 
      } 


      ecgErosion[erosionFirstArrayIndex] = min; 
      erosionFirstArrayIndex++; 
      ecgSampleForErosionIndex++; 


     } 
     return null; 


    } 

    } //End of Async Task 

yüzden yapmaya çalışıyorum her zaman uyumsuz görev belirli bir dizinin içeriğini değiştirmek olduğunu en azından şimdilik değil)

Ancak, bu uyumsuz görevi çalıştırdığımda EKG grafiğimde yavaşlar ve sarsılır. "Yeni Erozyon(). Execute();" Async görevini başladığım koddaki bölüm, grafik tekrar normal hale gelir.

Eşgüdümlü bir görev ayrı bir iş parçacığı üzerinde olması gerekiyor ve bu nedenle UI iş parçacığımda işlerimin nasıl gerçekleştiğini etkilemiyor mu? Neyi yanlış yapıyorum?

cevap

8

Arka plan iş parçacığına ağır bir kod parçası çalıştırsanız bile, aygıtın CPU yükünü etkileyecektir ve bu nedenle, aygıtın tek çekirdekli CPU'su varsa, UI iş parçacığınızda da gecikmelere neden olabilir.

Sürekli çalışan ve yalnızca CPU'yu aşırı yükleyen doInBackground yönteminde çok ağır bir döngü var gibi görünüyor. Bu döngü için ne olduğundan emin değilim, ama sürekli yenilemek yoksa başka konu daha çok CPU zamanı alma olanağı sunan bir iş parçacığı uyku eklemeyi düşünün isteyebilirsiniz: "Açıkçası

while (ecgIncoming) 
    { 
     ... do your thing ... 
     Thread.sleep(100); // wait for 100 milliseconds before running another loop 
    } 

100 "sadece bir sayıdır, eğer dizi saniyede bir güncellenirse, 1000 yapın, vs ...

+0

Evet, asenkron görevi sürekli olarak çalıştırıyorum çünkü kalp hızını gerçek zamanlı olarak hesaplamak için EKG verilerini kullanıyorum. Çok yoğun bir iş sürüyor - bu yüzden açıklamanız mantıklı. Sürekli bir arka plan hesaplama çalışması yapmak için kullanabileceğim Async görevinden başka bir şey var mı? – stu90

+3

@ stu90: "Sürekli bir arka plan hesaplama çalışması yapmak için kullanabileceğim Async görevinden başka bir şey var mı?" - Sorunu değiştirecek hiçbir şey yok. Bu iş parçacığı önceden arka plan önceliğine ayarlandı, ancak sahip olduğunuz yoğun döngüde fazla yardımcı olmayacak. Böyle yoğun döngüler birkaç on yıl boyunca zayıf bir form olarak kabul edildi. Talihawk'in önerdiği gibi, bir örnekleme oranı oluşturmalı ve diğer iş parçacıklarının CPU'da bir şansı olmasına izin vermelisiniz. Aynı zamanda, AsyncTask havuzundan süresiz olarak bir iş parçacığını bağlamak yerine kendi iş parçanızı da eklemenin daha iyi bir yoludur. – CommonsWare

+0

@ stu90 Bir Async görevi yerine bir Hizmet kullanabilirsiniz, ancak tek başına performansta büyük bir fark yaratacağından şüpheliyim. Hizmetin ayrı bir Linux işleminde çalışmasını sağlayabilirsiniz, ancak yine de bunun olup olmayacağını söyleyemem. Bu, ancak başlamanıza yardımcı olmalıdır: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html – elevine

0

Bir defaya mahsus olmak üzere new Erosion().execute(); kaç kez çalıştırıyorsunuz? Bunun nedeni birden çok kez yeni bir AsyncTask tahsis ediyor.

+0

nope sadece bir kez! ama arka planda çok uzun bir süre çalışıyor. bu yüzden çok fazla CPU kaynağı aldığını düşünüyorum. – stu90