私はアンドロイドスタジオで簡単なゲームを作ろうとしており、特定のイベントを遅らせる必要があります。Javaで遅延イベントを処理する最良の方法は何ですか
私はいくつかのグーグルを行うことから始め、Timer
とTimerTask
がかなり良い選択肢であることがわかりました。しかし、私の活動がに電話した場合、Timer.pause
はありません。私はすべてをキャンセルする必要があります。
私は、私のためのイベントを処理し、一時停止をサポートする自分のクラスを作成することに決めました。
私はSystem.currentTimeMillis
> = eventFinishedTime
かどうかを確認するために10ミリ秒ごとのイベントのArrayListを通じて簡単なユーザコマンドに「イベント(複数可)」を作成したクラス(EventHandler
)、およびサイクルを作りました。イベントが完了すると、intefaceメソッドが呼び出され、イベントはArrayListから自身を削除します。
今、私は新しい問題にぶつかります。
EventHandler
は、イベントが終了したときにインターフェイスメソッド(onFinished
)を呼び出します。したがって、onFinished
で最後に宣言されていない変数は使用できません。私が見つけることができるこの周りの唯一の方法は、イベントを遅らせるたびに新しい方法を作ることです。これは悪い習慣のようです。
私の質問は、これを行うにはどうすればよいですか、それともどうしますか?
は、あなただけの参考詳細は、お気軽にどの部分:) 指定し、私のコードを見たい場合は尋ねること自由に感じ...私はかなりを総括し、しようとする意思よりも午前さらに例を挙げて説明してください。
ありがとうございます!ここで
はEventHandler.class(私は輸入品が含まれていませんでした...インターフェイスメソッドが呼び出された場所を確認するために一番下までスクロール)である:私はそれを使用しようとするのはここ
public class EventHandler extends Thread {
//Constants
final String TAG = "EventHandler";
final long WAIT_TIME = 10;
public ArrayList<Event> events = new ArrayList<>(); //Every WAIT_TIME the run() funtion cycles through this list and checks if any events are complete
public boolean runChecks = true; //If true, the run() function goes (It's only false while the DoDayActivity tells it to pause
public long pauseStartTime; //This value tags the System.currentTimeMillis() @pauseCheck
public long totalPausedTime = 0; //This value contains how long the EventHandler was paused
Activity activity;
public EventHandler(Activity activity) {
this.activity = activity;
}
public void run() {
//checking the listeners
while (true) {
if (runChecks) {//Making sure the timer isn't paused
checkListeners();
}
try {
Thread.sleep(WAIT_TIME); //Yes I am using Thread.sleep(), kill me
} catch (Exception ignore) {
}
}
}
public interface OnEventListener {
void onFinished();
}
public void createEvent(String name, long milliseconds, OnEventListener eventListener) {//This is how an event is created, see the private Event class below
new Event(this, name, milliseconds, eventListener);
}
public void checkListeners() {
for (Event event : events) {
event.amIFinished();//A method that checks if the event has reached its end time
}
}
public void pauseCheck() { //"Pauses" the timer (Probably not the best way, but it is simple and does what I need it to
runChecks = false;
pauseStartTime = System.currentTimeMillis();
}
public void resumeCheck() {//Resumes the timer by adding the amount of time the EventHandler was paused for to the end if each event
try {
if ((pauseStartTime > 99999999)) {//For some reason, when an activity is created, onResume is called, so I added this in there to prevent glicthes
totalPausedTime = System.currentTimeMillis() - pauseStartTime;
Log.d(TAG, "Resuming, adding " + String.valueOf(totalPausedTime) + " milliseconds to each event");
for (Event e : events) {
e.end += totalPausedTime;
}
}
} catch (Exception e) {
Log.w(TAG, "During resume, EventHandler tried to add time to each of the events, but couldn't!");
e.printStackTrace();
}
runChecks = true;
}
private class Event { //Here is the class for the event
public long start;
public long end;
OnEventListener listener;
EventHandler parent;
String name;
public Event(EventHandler parent, String name, long milliseconds, OnEventListener listener) {
start = System.currentTimeMillis();
end = start + milliseconds;
this.listener = listener;
this.parent = parent;
this.name = name;
//Adding itself to the ArrayList
parent.events.add(this);
}
public void amIFinished() {//Method that checks if the event is completed
if (System.currentTimeMillis() >= end) {//Removes itself from the arraylist and calls onFinished
Log.d(TAG, "Completed " + name);
parent.events.remove(this);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
listener.onFinished(); //This is where the interface method is called!
}
});
}
}
}
}
です(これがint xを使用して単なる例です):
int x = 0;
eventHandler = new EventHandler(this);
eventHandler.start();
eventHandler.createEvent("Change X Value", 800, new EventHandler.OnEventListener() {
@Override
public void onFinished() {
//x is not declared final so it will not work
x = 5;
}
});
ポストを更新しました – Pythogen
cuncurrent programmで 'ArrayList'を使用しないでください。別のクラス 'CopyOnWriteArrayLis'、' ConcurrentLinkedQueue'、...を参照してください。 –