2016-01-20 66 views
0

你好我的同行程序員:)
我每次單擊我的應用程序中的一個按鈕時,都會調用函數waitRunnable(int seconds,int startId)4次。所以waitRunnable()應該等待可變的時間,並且時間由參數seconds設置。但是它們同時運行,所以如果最長的waitRunnable等待10秒鐘,其他3個waitRunnables等待更少的時間,那麼所有4個waitRunnables在10秒後結束,但第一個應該結束,然後第二個應該開始總時間將是所有參數的總和。我希望這不是不好解釋。Android Handler()Runnable,將Runnables排隊

在愛你的傑森< 3 THX的幫助:)

package com.example.Uebung10; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.support.v4.content.LocalBroadcastManager; 
import android.util.Log; 
import android.os.Handler; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

/** 
* Created by Jason on 14.01.2016. 
*/ 
public class MyService extends Service { 
    final String LOG_TAG = "myServiceLogs"; 
    Handler h = new Handler(); 
    List<String> finishedTasksInTheLast60Sec = new ArrayList<>(); 
    ExecutorService es; 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      sendBroadcast(finishedTasksInTheLast60Sec); 
      h.postDelayed(this, 60000); 
      finishedTasksInTheLast60Sec = new ArrayList<>(); 
     } 
    }; 

    private void waitRunnable(int seconds, int startId) { 
     h.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       finishedTasksInTheLast60Sec.add("Finished Task: MyRun#" + startId); 
       Log.d(LOG_TAG, "MyRun#" + startId + " end"); 
      } 
     }, TimeUnit.SECONDS.toMillis(seconds)); 
    } 

    private void sendBroadcast(List<String> finishedTasks) { 
     Intent intent = new Intent("myServiceUpdate"); 
     intent.putExtra("finishedTasks", (ArrayList<String>)finishedTasks); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
    } 

    public void onCreate() { 
     super.onCreate(); 
     Log.d(LOG_TAG, "MyService onCreate"); 
     es = Executors.newFixedThreadPool(1); 
     h.postDelayed(r, 60000); 

    } 

    public void onDestroy() { 
     super.onDestroy(); 
     h.removeCallbacks(r); 
     Log.d(LOG_TAG, "MyService onDestroy "); 
    } 

    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d(LOG_TAG, "MyService onStartCommand"); 
     readFlags(flags); 
     int time = intent.getIntExtra("time", 1); 
     if (time != -1) { 
      MyRun mr = new MyRun(time, startId); 
      es.execute(mr); 
     } else stopSelf(); 
     return START_NOT_STICKY; 
     //return START_STICKY; 
     //return START_REDELIVER_INTENT; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     Log.d(LOG_TAG, "onBind"); 
     return null; 
    } 

    void readFlags(int flags) { 
     if ((flags & START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY) 
      Log.d(LOG_TAG, "START_FLAG_REDELIVERY"); 
     if ((flags & START_FLAG_RETRY) == START_FLAG_RETRY) 
      Log.d(LOG_TAG, "START_FLAG_RETRY"); 
    } 

    class MyRun implements Runnable { 
     int time; 
     int startId; 

     public MyRun(int time, int startId) { 
      this.time = time; 
      this.startId = startId; 
      Log.d(LOG_TAG, "MyRun#" + startId + " create"); 
     } 

     @Override 
     public void run() { 
      Log.d(LOG_TAG, "MyRun#" + startId + " start, time = " + time); 
      waitRunnable(time, startId); 
     } 
    } 
} 

回答

1

您可以使用ExecutorService存儲的Runnables隊列,並在同一時間執行它們之一。請致電ExecutorService#submitRunnable添加到隊列中。

http://developer.android.com/reference/java/util/concurrent/ExecutorService.html

+0

但我想用handler.postDelayed功能在我waitRunnable(),所以一定的時間後,他將完成從本身!使用ExecutorService.submit我可以對Runnables進行排隊,但不能使用postDelayed方法的waitRunnable()!! –

+0

所以也許我的問題是壞的,我需要請求排隊postDelayed處理程序的方法:) –

+0

你可以讓每個'Runnable'在運行時調用'waitRunnable',這樣每個'Runnable'將啓動下一個並且他們將不得不按順序運行。 – TheoKanning