2011-03-20 14 views
6

Temel olarak, bir saniye sayacı ve bir düzey sayacı çalıştırmaya çalışıyorum. Her 10 saniyede ++ seviyesine geçmek istiyorum.
Ancak bu henüz uygulanmadı, şu ana kadar sadece görüntülenecek saniye elde etmeye çalışıyorum ama çalışma zamanı istisnaları ve bir çökme alıyorum.
Googling Bunu görüyorum çünkü UI'yi iş parçacığımdan güncelleştirmeye çalışıyorum ve buna izin verilmiyor. Yani asyncTask'a ihtiyacım var, ama bunu basit küçük programımla nasıl yapacağımı bilmiyorum.Android, benim saniye sayacımı güncelleştirecek basit bir iş parçacığı oluşturma

package com.ryan1; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class main extends Activity { 

int level = 1; 
int seconds_running=0; 

TextView the_seconds; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    the_seconds = (TextView) findViewById(R.id.textview_seconds); 



    Thread thread1 = new Thread(){ 
     public void run(){ 
      try { 
       sleep(1000); Log.d("RYAN", " RYAN "); 

       updated_secs(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.d("RYAN", " "+e); 
      } 
     } 
    }; 
    thread1.start(); 
} 

public void updated_secs(){ 
    seconds_running++; 
    the_seconds.setText(" "+seconds_running); 
} 
} 

cevap

6

UI iş parçacığınızda bir İşleyici oluşturun, ardından iş parçacığında işleyiciye (Handler.sendMessage (...)) bir ileti gönderin.

Mesaj UI iş parçacığınızda işlenecek, böylece metin parçacığını doğru bir şekilde güncelleyebilirsiniz. Şunun gibi: bu tür şeyleri için

private Handler myUIHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     if (msg.what == some_id_you_created) 
     { 
      //Update UI here... 
     } 
    } 
}; 

Then in your thread, to send a message to the handler you do this: 

Message theMessage = myHandler.obtainMessage(some_id_you_created); 
myUIHandler.sendMessage(theMessage);//Sends the message to the UI handler. 
+0

Hey! Aynı ismi paylaşıyoruz :) Bana örnek kod verebilir misiniz lütfen? Bunun üzerine saatler geçtikçe güzel beyin ölümü hissediyorum ... – Ryan

+0

Teşekkürler! Denerim! – Ryan

1

AsyncTask ve postDelayed yöntemi ile Eylemciler kullanarak inşa edilmiş bir Timer büyük example vardır ... yardımcı ya da bana bazı alternatifler verin.

UI'nin arka plandan güncellenmesinin no-no'dur.

+0

Yanıtladığınız için teşekkür ederiz! Bunu gerçekten gördüm, ama bunu ipliklerle yapmak istiyorum çünkü derslerde ilerlerken son derece önemli olduğunu duyduğum gibi konuları öğrenmek istiyorum ve sonunda bir çeşit oyun yapmaya geldim ... Yapmama yardım edebilir misin? Bu konu ile lütfen? – Ryan

+0

Ayrıca burada kullanılmayan AsyncTask görevini göremiyorum –

3

, başka iş parçacığı kullanmak kaybıdır; Bu sadece bir israf ve bunu yapar, böylece çok iş parçacıklı konularla uğraşmak zorundasınız. Bunun yerine, sadece Handler.sendDelayedMessage() kullanın: Bu uygulama bazı birikimlerine sahip olacak

static final int MSG_DO_IT = 1; 
static final long TIME_BETWEEN_MESSAGES = 10 * 1000; // 10 seconds 

Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case MSG_DO_IT: { 

       // Update your UI here... 

       Message newMsg = obtainMessage(MSG_DO_IT); 
       sendMessageDelayed(newMsg, TIME_BETWEEN_MESSAGES); 
      } break; 
     } 
    } 
} 

@Override 
void onResume() { 
    super.onResume(); 

    // Start the timer, executing first event immediately. 
    Message newMsg = mHandler.obtainMessage(MSG_DO_IT); 
    mHandler.sendMessage(newMsg); 
} 

@Override 
void onPause() { 
    super.onPause(); 

    // Stop the timer. 
    mHandler.removeMessages(MSG_DO_IT); 
} 

Not olduğunu - mesajlar arasındaki gerçek zamanlı TIME_BETWEEN_MESSAGES + (mesaj gönderme zamanı) 'dir. Eğer sürüklenmeyecek bir şeye ihtiyacınız varsa, Hander.sendMessageAtTime() yöntemini kullanarak zamanlamayı kendiniz yapabilir ve her seferinde sabit bir değerle yeni zamanı artırabilirsiniz, ondan sonra SystemClock.uptimeMillis() ile ilk kez başlamadan başlayabilirsiniz.().

İlgili konular