SORU
11 Mart 2012, Pazar


AsyncTask konuları sınırlar Android?

Her zaman kullanıcı sisteme günlükleri bazı bilgileri güncellemek lazım, ben de telefonda veritabanı kullanarak bir uygulama geliştiriyorum. Tüm bu işlemleri (güncellemeler db veri alma vb.) Zaman uyumsuz görevler kullanıyorum. Olarak şimdiye kadar görmedim ben neden yapmayayım bunları kullanmak, ama son zamanlarda ben deneyimli eğer yaptığım bazı işlemleri biraz zaman uyumsuz görevleri sadece stop öncesi yürütme ve atlamayın doİnBackground. O sadece kendini üzüyorsun kontrol etmek için başka bir basit bir uygulama geliştirdim o yüzden bırak öyle kalsın, çok garipti. Ve tuhaf yeterli, toplam zaman uyumsuz görevlerin sayısı 5, bir ön-yürütme durur 6 ulaştığında aynı davranış.

Android/Uygulama Etkinliği asyncTasks bir sınırı var mı? Yoksa sadece ve bildirilmelidir bazı böcek mi? Herkes aynı sorunu yaşarsınız ve buna bir çözüm buldum belki mi?

İşte kod:

Sadece bu iş parçacığı 5 arka plan: çalışma oluşturun

private class LongAsync extends AsyncTask<String, Void, String>
{
    @Override
    protected void onPreExecute()
    {
        Log.d("TestBug","onPreExecute");
        isRunning = true;
    }

    @Override
    protected String doInBackground(String... params)
    {
        Log.d("TestBug","doInBackground");
        while (isRunning)
        {

        }
        return null;
    }

    @Override
    protected void onPostExecute(String result)
    {
        Log.d("TestBug","onPostExecute");
    }
}

Ve o zaman bu iş parçacığı oluşturma. PreExecute girin ve hang (doİnBackground gidecek değil).

private class TestBug extends AsyncTask<String, Void, String>
{
    @Override
    protected void onPreExecute()
    {
        Log.d("TestBug","onPreExecute");

        waiting = new ProgressDialog(TestActivity.this);
        waiting.setMessage("Loading data");
        waiting.setIndeterminate(true);
        waiting.setCancelable(true);
        waiting.show();
    }

    @Override
    protected String doInBackground(String... params)
    {
        Log.d("TestBug","doInBackground");
        return null;
    }

    @Override
    protected void onPostExecute(String result)
    {
        waiting.cancel();
        Log.d("TestBug","onPostExecute");
    }
}

CEVAP
11 Mart 2012, Pazar


Tüm AsyncTasks içten bir paylaşılan () statik ThreadPoolExecutor LinkedBlockingQueue tarafından kontrol edilir. Bir AsyncTask execute çağırdığınızda, ThreadPoolExecutor gelecekte hazır bazı zaman yerine getirecek.

'Hazır' ThreadPoolExecutor bir davranışı iki parametre tarafından kontrol edilir . muyum? ^strong>çekirdek havuzu boyutuvemaksimum havuz boyutu. Eğer iş parçacığı etkin ve yeni bir iş geliyor çekirdek havuzu boyutundan daha az ise, işlerine yeni bir iş parçacığı oluşturmak ve hemen çalıştırır. En azından çekirdek iş parçacığı havuzu boyutu çalışıyorsa, iş sırası ve boş bir iş parçacığı kullanılabilir olana kadar beklemek (başka bir iş kadar yani tamamlandı) deneyecek. Mümkünse işi (sıra max kapasiteye sahip olabilir) sıraya değilse, bu işlerde çalıştırmak için yeni bir iş parçacığı (kadar maksimum havuz boyutu konuları) oluşturur. Temel olmayan boş iş parçacığı sonunda canlı tutma zaman aşımı parametresi göre görevden alınabilir.

1.6, çekirdek havuzu Android önce size 1 ve maksimum havuz boyutu 10 oldu. 5 ve maksimum havuz boyutu 1.6, Android beri 128. Sıra boyutunu her iki durumda da 10. Canlı tutma zaman aşımı 2.3, ve o zamandan beri 1 saniye önce 10 saniye oldu.

Bu düşünce ile, şimdi AsyncTask tek görevleri 5/6 yürütmek için görünür neden netleşiyor. 6. görev diğer görevleri tamamlamak kadar sıraya ediliyor. Bu uzun süren işlemler için AsyncTasks kullanmamalısınız neden hiç çalışan diğer AsyncTasks önleyecektir çok iyi bir sebeptir.

Kabul eder, eğer tekrarlanan egzersiz ile fazla 6 görevler (örneğin 30), göreceksiniz ki daha 6) doInBackground sıra olacak tam ve takipçisidir itti oluşturmak için daha fazla çalışan iş parçacığı. Eğer uzun süren bir görev olsaydı, o 20/30 aktif, sırada 10 hala birlikte olmak görmelisiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BiGSH0TROB

    BiGSH0TROB

    7 NİSAN 2011
  • Kassem G

    Kassem G

    25 EKİM 2006
  • pjtoohot

    pjtoohot

    15 NİSAN 2008