android - handler.postDelayed() 未执行
问题描述
所以我的问题是我无法让我的处理程序在一定时间后发布。出于某种原因,它会导致程序中的每个按钮出现故障并闪烁两种颜色。我愿意接受建议,如果某些东西比处理程序更好,我愿意切换代码。但是,我想避免使用 AsyncTask,因为我不知道如何使用它,而且它通常只会让我生气。尽管如果绝对必要,我愿意使用它。
@Override
public void run() {
random = new Random();
random2 = new Random();
try{
Thread.sleep(1000);
while(running){
ran = random.nextInt(9);
type = random2.nextInt(3);
if(lives > 0){
if((type == 0 || type == 2)){
runOnUiThread(new Runnable() {
@Override
public void run() {
buttons[ran].setImageResource(R.drawable.button_red);
buttons[ran].setTag("Red");
}
});
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(buttons[ran].getTag().equals("Red")){
buttons[ran].setTag("Black");
buttons[ran].setImageResource(R.drawable.button_null);
lifeLost();
}
}
}, 1000);
}else{
runOnUiThread(new Runnable() {
@Override
public void run() {
buttons[ran].setImageResource(R.drawable.button_white);
buttons[ran].setTag("White");
}
});
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(buttons[ran].getTag().equals("White")){
buttons[ran].setTag("Black");
buttons[ran].setImageResource(R.drawable.button_null);
}
}
}, 1000);
}
if(score == 10){
duration -= 50;
}else if(score == 20){
duration -= 50;
}else if(score == 30){
duration -= 40;
}else if(score == 40){
duration -= 15;
}
}else{
runOnUiThread(new Runnable() {
@Override
public void run() {
finished.setVisibility(View.VISIBLE);
}
});
try{
Thread.sleep(1000);
Intent overIntent = new Intent(this, OverActivity.class);
overIntent.putExtra("point", score);
startActivity(overIntent);
overridePendingTransition(0, 0);
}catch (Exception e){}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
解决方案
Animator 工作。如有必要,您可以使用延迟,而不是广告。
protected ArrayList<ValueAnimator> mAnimators = new ArrayList<>();
protected Map<ValueAnimator, ValueAnimator.AnimatorUpdateListener> mUpdateListeners = new HashMap<>();
private void initAnim(){
final int[] delays = new int[]{0, 500};
for (int i = 0; i < delays.length; i++) {
final ValueAnimator animator = ValueAnimator.ofInt(/*REd*/0xFFFF8080,/*Blue*/0xFF8080FF);
animator.setDuration(800);
animator.setEvaluator(new ArgbEvaluator());
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setTarget(i);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.setStartDelay(delays[i]);//if necessary,you can use Delay;
final int index = i;
mUpdateListeners.put(animator, new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
btns[index].setBackgroundColor((Integer) animation.getAnimatedValue());
}
});
mAnimators.add(animator);
}
}
public void onStartAnimator() {
if (mAnimators == null){
initAnim();
}
for (int i = 0; i < mAnimators.size(); i++) {
ValueAnimator animator = mAnimators.get(i);
//when the animator restart , add the updateListener again because they was removed by animator stop .
ValueAnimator.AnimatorUpdateListener updateListener = mUpdateListeners.get(animator);
if (updateListener != null) {
animator.addUpdateListener(updateListener);
}
animator.start();
}
}
记得在正确的时间完成动画,比如onDestroy
or onDetachedFromWindow
!!!
推荐阅读
- google-apps-script - 有没有办法从被复制锁定的谷歌表格复制?
- c# - C# selenium 脚本无法在 Chrome 无头模式下运行,但是相同的脚本在 Firefox 无头模式下运行良好
- c# - 如何将多个 SQL 连接转换为 LINQ 查询
- php - 面向对象的 PHP JSON 编码
- python - 超出构建 BST 递归深度
- python - 如何用零填充列表?当我尝试 .append(0) 时,我收到一条错误消息,指出“int”对象没有属性“add”
- assembly - 我的子程序跳转到 PUTS 而不是标签,我不明白为什么
- laravel-8 - 在 laravel 8 中加密的图像名称
- c++ - 在 B+ 树中表示孩子
- c# - 错误 CS0120:非静态字段、方法或属性“Encoding.GetBytes(string)”需要对象引用