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);
}
}
}
但我想用handler.postDelayed功能在我waitRunnable(),所以一定的时间后,他将完成从本身!使用ExecutorService.submit我可以对Runnables进行排队,但不能使用postDelayed方法的waitRunnable()!! –
所以也许我的问题是坏的,我需要请求排队postDelayed处理程序的方法:) –
你可以让每个'Runnable'在运行时调用'waitRunnable',这样每个'Runnable'将启动下一个并且他们将不得不按顺序运行。 – TheoKanning