2010-09-29 24 views
29

Oluşturduğum bir hizmette bir zamanlayıcı çalıştırırken sorun yaşıyorum. Zamanlayıcının aradığı görev çağrılmaz. Servisin içinde tostlar koyduğumdan başladığını biliyorum ve onlar çağrılır, ancak zamanlayıcı içinde olduklarında değil. Yardım aldım.Android Bir hizmet içinde Zamanlayıcı

hizmet sınıfı:

public class LocalService extends Service 
{ 
    private static Timer timer = new Timer(); 
    private Context ctx; 

    public IBinder onBind(Intent arg0) 
    { 
      return null; 
    } 

    public void onCreate() 
    { 
      super.onCreate(); 
      ctx = this; 
      startService(); 
    } 

    private void startService() 
    {   
     timer.scheduleAtFixedRate(new mainTask(), 0, 5000); 
    } 

    private class mainTask extends TimerTask 
    { 
     public void run() 
     { 
      Toast.makeText(ctx, "test", Toast.LENGTH_SHORT).show(); 
     } 
    }  

    public void onDestroy() 
    { 
      super.onDestroy(); 
      Toast.makeText(this, "Service Stopped ...", Toast.LENGTH_SHORT).show(); 
    }  
} 

Ana sınıfı:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    startService(new Intent(RingerSchedule.this, LocalService.class));  
} 

cevap

49

Android ana iş parçacığı dışından tost, gibi UI olaylarına izin vermez. Kaçış deniyor, ama Toast göz ardı ediliyor.

public class LocalService extends Service 
{ 
    private static Timer timer = new Timer(); 
    private Context ctx; 

    public IBinder onBind(Intent arg0) 
    { 
      return null; 
    } 

    public void onCreate() 
    { 
      super.onCreate(); 
      ctx = this; 
      startService(); 
    } 

    private void startService() 
    {   
     timer.scheduleAtFixedRate(new mainTask(), 0, 5000); 
    } 

    private class mainTask extends TimerTask 
    { 
     public void run() 
     { 
      toastHandler.sendEmptyMessage(0); 
     } 
    }  

    public void onDestroy() 
    { 
      super.onDestroy(); 
      Toast.makeText(this, "Service Stopped ...", Toast.LENGTH_SHORT).show(); 
    } 

    private final Handler toastHandler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_SHORT).show(); 
     } 
    };  
} 
+0

Teşekkür:

Bir Handler ve şöyle boş bir mesajı kullanabilirsiniz UI iş parçacığı üzerinde Tost oluşturmak için çalıştı. – Woody

+0

Tam olarak doğru cevap. – Nakedible

+0

Bu cevabı uzun zamandır arıyordum. – santBart

0

Teşekkürler, ben de zamanlayıcı iptal etmek için gerekli ..

public void onDestroy() { 
     timer.cancel(); 
     Toast.makeText(this, "ServiceTalkGeology stopped.", 
     Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
} 
İlgili konular