2012-01-07 26 views

cevap

21

Muhtemelen yetişmiş beri bu yine bir Handler olan farklı bir öneri yapmak istiyorum dışarı TimerTask

kontrol etmek istiyorum. Hander'ın UI iş parçacığı üzerinde oluşturulduğu veya oluşturucusunda ana lüper kullanarak oluşturduğu UI iş parçacığıyla ilişkilendirileceği için runOnUiThread öğesini açıkça çağırmanız gerekmeyeceği için TimerTask'dan daha basittir. Bu şekilde çalışacak: işleyicinizin hala don eğer çalışırken

  1. Sizin aktivite olmayan görünür kapanma/olabilir:

    private Handler mHandler; 
    Runnable myTask = new Runnable() { 
        @Override 
        public void run() { 
        //do work 
        mHandler.postDelayed(this, 1000); 
        } 
    } 
    
    @Override 
    public void onCreate(Bundle savedState) { 
        super.onCreate(savedState); 
        mHandler = new Handler(Looper.getMainLooper()); 
    } 
    //just as an example, we'll start the task when the activity is started 
    @Override 
    public void onStart() { 
        super.onStart(); 
        mHandler.postDelayed(myTask, 1000); 
    } 
    
    //at some point in your program you will probably want the handler to stop (in onStop is a good place) 
    @Override 
    public void onStop() { 
        super.onStop(); 
        mHandler.removeCallbacks(myTask); 
    } 
    

    sizin aktivitede işleyicilerle Dikkat edilmesi gereken bazı şeyler vardır OnStop'ta durdurun (veya onResume'de başlattıysanız), bu UI'yi güncelleştirmeye çalışırsanız bu sorunlara yol açacaktır

  2. Telefonunuz derin uykuya girerse, işleyiciler elinizde olduğu kadar sık ​​ateş etmez belirtildi. Bunu, birçok saat çalıştıktan sonra bağlantıyı test etmek için bluetooth cihazları ile kapsamlı testler yaptığımı biliyorum ve her kullanışlarında günlük baskılarla birlikte işleyicileri kullandım.
  3. Devam etmek için bu zamanlayıcıya ihtiyacınız varsa, bunu bir etkinlikten daha uzun sürecek bir hizmete koymanızı öneririz. Etkinliğinizi servise kaydettirin (servisle iletişim kurmak için serviste tanımlanmış bir arayüz uygulayarak).
+0

Bağlantı çalışmıyor. – laarsk

+1

Sizin için düzeltildi. –

+0

Bunun için teşekkürler! :) – laarsk

11

Geçerli projemde kullandığım kod budur. Matt'in dediği gibi TimerTask kullandım. 60000 milisec'dir. = 60 sn. Maç puanlarını yenilemek için kullandım.

private void refreshTimer() { 
     autoUpdate = new Timer(); 
     autoUpdate.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         adapter = Score.getScoreListAdapter(getApplicationContext()); 
         adapter.forceReload(); 
         setListAdapter(adapter); 
        } 
       }); 
      } 
     }, 0, 60000); 
+0

Çalışmıyor. AutoUpdate ne demektir? ve runOnUiThread. Eksi – l0gg3r

+3

Bu sorular pek alakalı değil, l0gg3r. Kullanıcı arabiriminde 60 saniye sonra çalışacak bir görev örneği verdi. Herhangi bir Android geliştiricisi kodu kolayca anlayabilmelidir. –

+0

Yine de bir şey, @GiantRobot. Bu örnek setTimeout'tan daha setInterval gibi davranır. Bu kodun setTimeout için kullanılması gereken değişiklikler: değerlerin sırasını değiştirir (60000, 0 yerine 0, 60000) ve zamanlayıcıyı run() işlevinde durdurur, böylece yalnızca bir kez çalışır. –

1

underscore-java kütüphanede setTimeout() yöntemi yoktur.

Kod örnek:

import com.github.underscore.lodash.$; 
import com.github.underscore.Function; 

public class Main { 

    public static void main(String[] args) { 
     final Integer[] counter = new Integer[] {0}; 
     Function<Void> incr = new Function<Void>() { public Void apply() { 
      counter[0]++; return null; } }; 
     $.setTimeout(incr, 100); 
    } 
} 

fonksiyon yeni bir iplikle 100ms başlanacaktır. Valentyn cevaba devamı niteliğindeki

1

java çizgi kullanılarak:

gradle için bağımlılık ekleyin:

dependencies { 
    compile group: 'com.github.javadev', name: 'underscore', version: '1.15' 
} 

Java: bir

import com.github.underscore.lodash.$; 

$.setTimeout(new Function<Void>() { 
    public Void apply() { 
     // work 
     return null; 
    } 
}, 1000); // 1 second 
İlgili konular