13

E.g .: Birkaç saniye sürecek bir şey yapacak ve kullanıcı arayüzünü dondurmak istemezsin, değil mi? Bir AsyncTask kullanabilirsiniz ama küçük bir donma sorununu çözmek için harici (veya iç) bir sınıf oluşturmak istemezsiniz.İyi bir uygulama, paralel küçük bilinen dondurma işlemi için anonim AsyncTask oluşturuyor mu?

Peki, iyi bir pratice mi? Ben Bitmap'ler sıkıştırarak ve öğeleri içindeki bazı verileri güncelleştirmek için büyük dizi döngü sırasında

package com.example.stackoverflowsandbox; 

import android.os.AsyncTask; 

public class Foo { 
    // E.g. before call foo method you change you Activity to loading state. 
    private void foo() { 
     new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected Void doInBackground(final Void ... params) { 
       // something you know that will take a few seconds 

       return null; 
      } 

      @Override 
      protected void onPostExecute(final Void result) { 
       // continue what you are doing... 

       Foo.this.continueSomething(); 
      } 
     }.execute(); 
    } 

    private void continueSomething() { 
     // some code... 
    } 
} 

Bunun ile karşı karşıya ettik.

+3

Bunun nasıl kaydettiğini görmüyorum:

new AsyncTask<Void, Void, Void>() { .... .... }.execute(); <------ serial execution 


yerine parçacığı havuzu vasisi kullanmak Bir iç sınıf oluşturma vs herhangi bir iş, sadece korkunç dağınık görünüyor IMO – tyczj

+1

Bu sadece ... ng ne olabilirdi, Aktivite artalana ya da yok edildikten sonra Thread (AsyncTask) çalışmaya devam etmesidir. Ama genel olarak bu korkunç, çünkü anonim sınıf, kodun bir kısmında ödünç alınır. –

+2

sadece okunabilirlik sorusu için, anonim iç sınıftan yaratılan nesnelerin 'OuterClass $ 2' adlı notasyon ile çağrıldığını ve iç sınıfı iç içe başlatmaya başlarsanız, hata ayıklama zor olabilir – Blackbelt

cevap

24

Evet, ama yapma şekliniz değil.

Honeycomb başlayan AsyncTasks varsayılan yürütme modeli seri olduğunu unutmayın:

new AsyncTask<Void, Void, Void>() { 
     .... 
     .... 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); <------ parallel execution 
+0

Teşekkürler ama eğer böyle iyi bir uygulama kodu ise. =] –

+0

'gibi' ile anonim asenkronizasyonların örneklenmesi anlamına gelirse, o zaman cevap evet olur. kod yürütme ve hatta bir android geliştirici açısından sorun yok ne demek istediğini bilecek –

+5

CLARIFICATION: execute() sadece bu şekilde çağrılan diğer AsyncTasks ile ilgili görevleri seri olarak çalıştırır. Bu, onları çalıştıran tek bir arka plan iş parçacığıdır, ancak hala arayan kişi ile paraleldir. – Debriter