2014-09-28 40 views
0

我正在創建一個ScheduledThreadPool以定期運行一些方法調用。 因爲我想一切都保存到數據庫每10秒一個例子...... 所以我就:Android在哪裏創建ScheduledThreadPool,如果不關機會發生什麼?

public class Scheduler{ 
    ScheduledExecutorService scheduledExecutorService = 
     Executors.newScheduledThreadPool(5); 

public Scheduler(){ 
    foo = Foo.getInstance(); 

    saveValues(); 
} 

private void saveValues(){ 
    ScheduledFuture saveValues = scheduledExecutorService.scheduleAtFixedRate(
      new Runnable(){ 
       public void run() { 
        Log.e(TAG, "in save values"); 

        foo.save(); 
       } 
      }, 2000, 2000, TimeUnit.MILLISECONDS); 
} 
} 

,但問題是它運行一次,永無。 我在一篇教程中看到,關閉Executer是非常重要的,因爲它可能會永遠運行,否則我希望我不需要關心它的生命週期,除非創建它並關閉它。

Foo是一個Api,它是一個單例。它被activity調用並調用Scheduler。我還想知道它是否應該擴展應用程序,但是還沒有發現它。

在我的應用程序中,我需要調用它,在調度程序類中可以嗎?調度程序是否需要成爲Runnable?我究竟在哪裏關閉了Executer?

在此先感謝

PS:如果你認爲一個執行者是不是做了正確的方式,讓我知道。我瀏覽了很多主題和頁面,並沒有找到完美的答案,所以Executer看起來很好。

+0

嘗試用10秒超時遞歸。 'Thread.sleep(10000)'或類似的東西。沒有必要使用'scheduledExecutorService'。還要確保你不會在UI線程中啓動它。嘗試'class MyAsyncClass extends AsyncTask {}'then'new RetreivePicture()。execute();' – Pierre 2014-09-28 00:14:39

+0

我需要調度一些操作,所以只是一個簡單的線程並不是真的這樣做。回到主要問題:我在哪裏使用Executer? :D – Ginbak 2014-09-28 00:27:42

+1

'foo.save()'是否會返回? – Fildor 2014-09-28 00:37:55

回答

2

是否應該只綁定一個活動?您是否需要跨應用程序的功能,即使該活動被破壞?

我做了這樣的功能擴展Service。這裏是代碼:

public class MyService extends Service { 

    static final public String SERVICE_RESULT = "com.my.app.MyService.SMS_UPDATED"; 
    static final public String SERVICE_MESSAGE = "SMS updated"; 

    int SECONDS = 10; 

    LocalBroadcastManager broadcaster; 

    ScheduledExecutorService scheduledExecutorService = 
      Executors.newScheduledThreadPool(5); 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 


     ScheduledFuture scheduledFuture = 
       scheduledExecutorService.scheduleAtFixedRate(new Runnable() { 
        @Override 
        public void run() { 

         // do some processing... and then 

         sendResult(SERVICE_MESSAGE); 

        } 
       }, SECONDS, SECONDS, TimeUnit.SECONDS); 

     return Service.START_STICKY; 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     broadcaster = LocalBroadcastManager.getInstance(this); 

     // if you need any initialization... 
    } 


    public void sendResult(String message) { 
     Intent intent = new Intent(SERVICE_RESULT); 
     if (message != null) 
      intent.putExtra(SERVICE_RESULT, message); 
     broadcaster.sendBroadcast(intent); 
    } 
} 

所以,我用意圖溝通處理結果回我的應用程序。通過使用scheduleAtFixedRate我可以每10秒運行一次任務,您應該根據需要進行修改。然後,注意Service.START_STICKY;它定義了服務是否應該重新啓動。

您發佈的代碼似乎是正確的,但是,如果它在活動中並且您在其他人需要它..也許它正在被銷燬。

+0

開放,看起來相當不錯,我會嘗試一下。 我認爲的主要問題在於我的情況,Fildor指出,該方法從未返回,但您回答了其他一些問題,謝謝。 – Ginbak 2014-09-28 15:52:48

+0

這個可以用得很廣泛,非常有用謝謝! +1 – Pierre 2014-10-10 15:34:45

相關問題