2015-08-29 21 views
12

'de Looper.prepare() adlı iş parçacığı içinde işleyici oluşturulamıyor Hizmetim var. Ve oradaServiceUpdate() adında bir yöntem var. Bu yöntem, Google Haritalar API'sında onCocationChanged() ile benzer. Bu benim kodudurCountDownTimer

Can't create handler inside thread that has not called Looper.prepare() 
    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
      at android.os.Handler.<init>(Handler.java:200) 
      at android.os.Handler.<init>(Handler.java:114) 
      at android.os.CountDownTimer$1.<init>(CountDownTimer.java:114) 
      at android.os.CountDownTimer.<init>(CountDownTimer.java:114) 
      at skripsi.ubm.studenttracking.Service2$6.<init>(Service2.java:317) 
      at skripsi.ubm.studenttracking.Service2.onServiceUpdate(Service2.java:317) 

:

Yani onServiceUpdate() böyle yöntemle ancak gösteren hata içeride countDownTimer başlatmak istediğiniz

@Override 
    public void onServiceUpdate(ServiceState state) 
    { 
final float[] distance = new float[2]; 
     Location.distanceBetween(state.getGeoPoint().getLatitude(), state.getGeoPoint().getLongitude(), 6.130607787619352,106.81839518499267, distance); 
     if (distance[0] > 25.0) 
     { 

         CountDownTimer cdt5 = new CountDownTimer(total_onServiceUpdate,1000) { 
          @Override 
          public void onTick(long millisUntilFinished) { 
           total_onServiceUpdate = millisUntilFinished/1000; 
          } 

          @Override 
          public void onFinish() { 
           sendSMS(); 
           stopSelf(); 
          } 
         }.start(); 

     } 

cevap

15

onServiceUpdate() alır aktivitesinde yerel broadcast-receiver, dolayısıyla onun bir arka plan iş parçacığı uygulamak. Tek yapmanız gereken timer.start(); Ana Konu itibaren, Servis aslında o kadar değil intentService, çözüm şimdi efendim devam edebilirsiniz

new Handler(Looper.getMainLooper()).post(new Runnable() {   
     @Override 
     public void run() { 
      CountDownTimer cdt5 = new CountDownTimer(total_onServiceUpdate,1000) { 
         @Override 
         public void onTick(long millisUntilFinished) { 
          total_onServiceUpdate = millisUntilFinished/1000; 
         } 

         @Override 
         public void onFinish() { 
          sendSMS(); 
          stopSelf(); 
         } 
        }.start(); 
     } 
    }); 

yolları boyunca olan, ana Konu üzerinde çalışır. Eylemciler

if (Looper.MyLooper() == null) {çağırmadan önce

Bu deneyin: Daima main Looper

üzerinde Ekranlı kodlarını flört diyoruz o

+0

Great help değerinde 'millisInFuture 'değerini değiştirerek olabileceğini düşünüyorum. Bir soru daha. Bu işleyicide kendini() durdurmak istiyorum ama işe yaramadı. Bana yardım eder misin ? –

+0

hizmet durmadı? TheNameOfYourService.this.stopSelf() işlevini denemeyin, eğer stopService (yeni Intent (getApplicationContext(), TheNameOfYourService.class)) 'i deneyin,' cat_.if 'yi öldürmenin farklı yolları vardır. Beni biraz hizmetinize tanıtın. @LeonardFebrianto ve göreviniz yorum ve çözümlerle çözüldüyse ya da işaretleyecekseniz lütfen bana bildirin. – Elltz

0

Bence sorundur (sizin SendSMS o) UIThread (bir görünümü güncellemek gibi) gerektiren bir şey yapmaya çalışıyorsunuz. bu deneyin:

Handler mHandler = new Handler() { 
public void handleMessage(Message msg){ 
    sendSMS(); 
}}; 

@Override 
public void onFinish() { 
    mHandler.sendEmptyMessage(0); 
    stopSelf(); 
} 
+0

Hata cdt.start() 'dan sonra atar. OnFinish() 'yönteminde herhangi bir eylem gerçekleştirmez. Sorunun her “onTick” – Lau

0

için onFinish yöntemini değiştirin işleyici gui iş parçacığı oluşturulan gerektiğinden Bir kabı yoluyla bir hizmetten etkinlik GUI güncelleştirmek olamaz.

yerine size hizmetten send a broadcast zorunda ve çalışır ve size bildirir bir aysnchronous iştir bu Yayına

0

Android'i yardımcı olur umarım Looper.Prepare(); }