2014-09-12 115 views
0

我是Android新手。 我做了服務和線程的應用程序,顯示敬酒每5秒:android:延遲線程

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class MyService extends Service { 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
    Handler mHandler = new Handler(); 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     final Runnable RunnableUpdateResults = new Runnable() { 
      public void run() { 
       Toast.makeText(getBaseContext(), "Hello", Toast.LENGTH_SHORT).show(); 
      } 
     }; 
     new Thread() { 
      public void run() { 
       try {     
         mHandler.postDelayed(RunnableUpdateResults); 
         sleep(5000); 
       } catch (InterruptedException e) {e.printStackTrace();} 
      } 
     }.start(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     return START_STICKY; 
    } 

    public void onStart(final Context context,Intent intent, int startId) 
    { 
    } 
} 

,但只顯示一次我的吐司。沒有崩潰。 我爲此使用了Handler的postDelayed函數。它將在主UI線程上以指定的延遲運行你的代碼,所以你將能夠更新UI控件,但它不適用。

任何解決方案重複執行任務?

回答

1

電話Thread.sleep內while循環:

boolean isThreadRunning=true; 
new Thread() { 
      public void run() { 
       try {  
         while(isThreadRunning){    
         mHandler.postDelayed(RunnableUpdateResults); 
         sleep(5000); 
         } 
       } catch (InterruptedException e) {e.printStackTrace();} 
      } 
     }.start(); 

要停止線程使isThreadRunning=false;

您可以使用相同的實現handler.postDelayed

RunnableUpdateResults呼叫mHandler.postDelayed:

final Runnable RunnableUpdateResults = new Runnable() { 
      public void run() { 
       mHandler.postDelayed(RunnableUpdateResults,5000); 
       Toast.makeText(getBaseContext(), 
         "Hello", Toast.LENGTH_SHORT).show(); 
      } 
     }; 

要停止處理程序呼叫removeCallbacks方法:

mHandler.removeCallbacks(RunnableUpdateResults); 
0

使用TimerTimerTask

new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 
      mHandler.post(RunnableUpdateResults);     
     } 
    }, 0, 5000);