有没有更好的方法来做这件事?这是我正在制作的一个Kegel应用程序,没有人想在他们变老的时候滴水,对吧?!我尝试过在for循环中使用它,但它只循环一次。:(现在我只是输入更多,因为网站不允许我发布,因为它说我的帖子看起来主要是代码。
public final void onClick(View view) {
switch (view.getId()) {
case R.id.tvBeginner:
tvBeginner.setText("Beginner exercise in progress...");
Runnable clenchRunnable = new Runnable() {
@Override
public void run() {
try {
tvExpert.setText("");
tvIntermediate.setText("Clench!!!");
tvIntermediate.setTextSize(60);
vibrate.vibrate(250);
clenchDone = true;
} catch (Exception e) {
e.printStackTrace();
}
}
};
Runnable relaxRunnable = new Runnable() {
@Override
public void run() {
try {
tvIntermediate.setText("");
tvExpert.setText("Relax...");
tvExpert.setTextSize(40);
tvExpert.setTextColor(Color.GREEN);
vibrate.vibrate(250);
clenchDone = false;
} catch (Exception e) {
e.printStackTrace();
}
}
};
clenchHandler.postDelayed(clenchRunnable, 1000);
relaxHandler.postDelayed(relaxRunnable, 2000);
clenchHandler.postDelayed(clenchRunnable, 3000);
relaxHandler.postDelayed(relaxRunnable, 4000);
clenchHandler.postDelayed(clenchRunnable, 5000);
relaxHandler.postDelayed(relaxRunnable, 6000);
clenchHandler.postDelayed(clenchRunnable, 7000);
relaxHandler.postDelayed(relaxRunnable, 8000);
clenchHandler.postDelayed(clenchRunnable, 9000);
relaxHandler.postDelayed(relaxRunnable, 10000);
clenchHandler.postDelayed(clenchRunnable, 11000);
relaxHandler.postDelayed(relaxRunnable, 12000);
clenchHandler.postDelayed(clenchRunnable, 13000);
relaxHandler.postDelayed(relaxRunnable, 14000);
clenchHandler.postDelayed(clenchRunnable, 15000);
relaxHandler.postDelayed(relaxRunnable, 16000);
clenchHandler.postDelayed(clenchRunnable, 17000);
relaxHandler.postDelayed(relaxRunnable, 18000);
clenchHandler.postDelayed(clenchRunnable, 19000);
relaxHandler.postDelayed(relaxRunnable, 20000);
break;发布于 2015-01-17 02:03:59
你可以在它们各自的runnables中调用relaxHandler,clenchHandler,并保留一个计数器来记录你想要调用它的次数,例如:
int i =0;
Runnable relaxRunnable = new Runnable() {
@Override
public void run() {
try {
tvIntermediate.setText("");
tvExpert.setText("Relax...");
tvExpert.setTextSize(40);
tvExpert.setTextColor(Color.GREEN);
vibrate.vibrate(250);
clenchDone = false;
} catch (Exception e) {
e.printStackTrace();
}
if(i <= numTimesToRun) {
relaxHandler.postDelayed(relaxRunnable, time_out_variable);
i++;
}
}
};然后对clenchHandler执行相同的操作,使其运行x次
发布于 2015-01-17 02:12:49
所以我要试一试...
private static final int SWITCH_DELAY = 1000;
private Handler handler;
private boolean beginnerCycleActive = false;
private boolean clenched = false;
public final void onClick(View view) {
switch (view.getId()) {
case R.id.tvBeginner:
startBeginnerCycle();
break;
}
}
private void startBeginnerCycle(){
beginnerCycleActive = true;
tvBeginner.setText("Beginner exercise in progress...");
doCycle();
}
private void stopBeginnerCycle(){
beginnerCycleActive = false;
}
private void doCycle(){
onClench();
handler.postDelayed(new Runnable(){
public void run(){
onRelax();
handler.postDelayed(new Runnable(){
public void run(){
if(beginnerCycleActive) doCycle();
}
}, SWITCH_DELAY);
}
}, SWITCH_DELAY);
}
private void onClench(){
try {
tvExpert.setText("");
tvIntermediate.setText("Clench!!!");
tvIntermediate.setTextSize(60);
vibrate.vibrate(250);
clenched = true;
}
catch (Exception e) {
e.printStackTrace();
}
}
private void onRelax(){
try {
tvIntermediate.setText("");
tvExpert.setText("Relax...");
tvExpert.setTextSize(40);
tvExpert.setTextColor(Color.GREEN);
vibrate.vibrate(250);
clenched = false;
}
catch (Exception e) {
e.printStackTrace();
}
}看起来干净多了,不需要重复,可以通过调用stopBeginnerCycle()轻松地停止
发布于 2015-01-17 02:18:43
你应该看看ScheduledThreadPoolExecutor。它可用于以循环周期在固定时间运行Runnable。下面的例子将向你展示它是如何工作的。
class YourRunnable implements Runnable {
@Override
public void run() {
//Do your stuff
}
}
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
long period = 10000; // the period between successive executions
exec.scheduleAtFixedRate(new YourRunnable (), 0, duration, TimeUnit.MICROSECONDS); // It can be seconds, miliseconds...我认为在您的案例中使用ScheduledThreadPoolExecutor非常容易。
https://stackoverflow.com/questions/27988192
复制相似问题