2010-09-29 4 views
29

Je rencontre des problèmes lors de l'exécution d'une minuterie dans un service que j'ai créé. La tâche que le temporisateur appelle simplement n'est pas appelée. Je sais que le service commence comme j'ai mis des toasts à l'intérieur et ils sont appelés, mais pas quand ils sont dans le délai. Aide appréciée.Minuterie Android dans un service

classe de service:

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(); 
    }  
} 

Classe principale:

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

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

Répondre

49

Android ne permet pas des événements de l'interface utilisateur comme Toasts de l'extérieur du thread principal. La course est appelée, mais le Toast est ignoré.

Pour créer le Toast sur le thread d'interface utilisateur, vous pouvez utiliser un gestionnaire et un vide message comme ceci:

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

Merci , travaillé. – Woody

+0

Exactement la bonne réponse. – Nakedible

+0

Je cherchais cette réponse depuis longtemps. – santBart

0

Merci, j'ai aussi besoin pour annuler la minuterie ..

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