2012-10-26 20 views
5

Ağ üzerinden alınan görüntülerin listesiyle bir liste görünümüne sahip olduğumuz bir uygulamayı test ediyorum. Uygulamayı android cihaz 2.3.3 (WIFI hız 512 KBPS) üzerinde çalıştırdığımda ve DDMS'yi (Thread Viewer) kontrol ettiğimde, iş parçacığı sayısı 25'ten 50'ye kadar artıyor. Ama aynı uygulamayı cihaz 4.0'da test ettiğimde (WIFI hızı) 5 MBPS), iplik sayısı artmadı.Android - 2.3.3 ve 4.0 işletim sisteminde Async Görev davranışı

Bunun neden olduğunu anlamama yardımcı olan var mı? Android işletim sistemi farklılığı veya başka bir nedenden dolayı mı?

Şimdiden teşekkürler.

+1

ilgili kodun gönderin tadını çıkarın! – vikki

+0

Sadece apk dosyasını aldım. Kodu bende yok. – Prem

cevap

13

AsyncTask kullanıyor musunuz? Android 3.0'dan sonra, AsyncTask varsayılan davranışı, SERIAL_EXECUTOR kullanılarak tek bir iş parçacığında yürütülür.

AsyncTask'un herhangi bir sistem sürümünde aynı anda çalıştırılmasını isterseniz, bu kodu kullanabilirsiniz.

AsyncTask task = new YourTask(); 
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { 
    task.execute(params); 
} else { 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
} 

İşletim Sistemi Ön Yüklemesi 1.6 - Çoklu Eş Zamanlı Görevler sırayla yürütülür. OS 1.6 OS 2.3'e kadar - Async Tasks paralel olarak çalışır. 3.0'dan - Tekrar, Async Görevleri sırayla yürütülür.

+1

Bu tasarım seçimlerinin neden yapıldığına dair bir haber var mı? –

1

Arka plan işlemini yürütmek için bir AsyncTask kullanıyor musunuz? GB ve ICS arasındaki AsyncTask uygulaması arasında bir fark olduğunu düşünüyorum.

İş parçacığı işini bitirdiğinde ve iki sürüm arasında bir fark olup olmadığını görmek için bazı hata ayıklama günlüğü eklemeye çalışın.

+0

Teşekkürler dnkoutso ... Evet, Async Task arka plan işlemini yürütmek için kullanılır. Daha iyi anlamak için ne tür bir hata ayıklama kaydı yapabiliriz? – Prem

+0

İş parçacığınız çalıştığı zaman. Eğer bir asynctask varsa dahili olarak kullanılan sabit bir threadpool olabilir. İpliklerin orada olduğu gerçeği bir şey anlamına gelmez, gerektiğinde tekrar kullanılacaktır. – dnkoutso

0

API < 11 için AsyncTaskCompat.executeInParallel'ı kullanabilirsiniz, bu sınıfı appcompat v4 kitaplığında bulabilirsiniz. Kullanım

Bir exemple:

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Bitmap>() { 
     @Override 
     protected Bitmap doInBackground(Void... params) { 
      return MediaStore.Images.Thumbnails.getThumbnail(
        imageView.getContext().getContentResolver(), 
        id, 
        MediaStore.Images.Thumbnails.MINI_KIND, 
        null); 
     } 
     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      imageView.setImageBitmap(bitmap); 
      if (bitmap != null) { 
       // Add the image to the memory cache first 
       CACHE.put(id, bitmap); 
       if (listener != null) { 
        listener.onImageLoaded(bitmap); 
       } 
      } 
     } 
    }); 

İlgili konular