gpt4 book ai didi

java - 为什么我在没有使用 android.os.CountDownTimer 调用 Looper.prepare() 的线程中得到一个 "Can' t 创建处理程序?

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:12 26 4
gpt4 key购买 nike

当使用这个类时,我得到了这个奇怪的异常。它用于为我的游戏打印出一个漂亮的计时器显示,并在创建我的主 GameView 类时创建。错误在第 26 行抛出:super(s*1000,1000);

package tommedley.android.game;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.CountDownTimer;

public class Timer extends CountDownTimer{
public static int MODE_COUNTING = 0;
public static int MODE_PAUSED = 1;
public static int MODE_FINISHED = 2;

private Canvas canvas;
private Context context;
private float xPos;
private float yPos;
private static int DIGIT_WIDTH = 50;
private static int DIGIT_HEIGHT = 70;
private int numDigits = 3;
private int seconds;
Drawable[] digitImgs;
private int mode;


public Timer(Canvas c, Context con, float x, float y, int digits, int s){
super(s*1000, 1000);
mode = MODE_COUNTING;
canvas = c;
context = con;
xPos = x;
yPos = y;
seconds = s;
numDigits = digits;
digitImgs = new Drawable[numDigits];
this.start();
}
public void draw(){
String reprNum = String.format("%0"+numDigits+"d", seconds);
for(int i = 0;i<numDigits;i++){
switch(reprNum.charAt(i)){
case '0':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_0);
break;
case '1':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_1);
break;
case '2':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_2);
break;
case '3':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_3);
break;
case '4':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_4);
break;
case '5':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_5);
break;
case '6':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_6);
break;
case '7':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_7);
break;
case '8':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_8);
break;
case '9':
digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_9);
break;
}
digitImgs[i].setBounds((int)xPos+DIGIT_WIDTH*i, (int)yPos, (int)xPos+DIGIT_WIDTH*(i+1), (int)yPos+DIGIT_HEIGHT);
digitImgs[i].draw(canvas);
}
}
@Override
public void onFinish() {
seconds = 0;
mode = MODE_FINISHED;
}
@Override
public void onTick(long millsLeft) {
seconds = (int)millsLeft / 1000;
}
public int getMode(){
return mode;
}
}

最佳答案

这有点奇怪——我想你一定是在主线程以外的线程上构造这个对象?

我不知道你是否熟悉HandlersLoopers,但它们是Android 在线程上进行异步操作的方式。如果你想在一个线程上执行异步操作,你可以使用一个 Handler 来完成它。但是在使用 Handler 之前,您必须通过创建 MessageQueue 来准备线程,这是通过调用 Looper.prepare() 来完成的。

如果你看the source对于 CountDownTimer 类,您会注意到它创建了一个私有(private)的 Handler 实例。这个成员变量是在构造函数执行之前直接创建的,这就是为什么在调用 super 时抛出异常。

因此,您需要做的就是在构造 Timer 之前调用 Looper.prepare()但是,如果您在主线程上构造 Timer,则不需要执行此操作。 Android 进程的主线程被自动声明为一个循环程序(如果您已经在主线程上调用它并且仍然得到这个异常,那么这确实很奇怪)。据我从稀疏的 javadocs 中可以看出,这个类是用来在主线程上使用的,所以这就是我推荐的做法。您的 onTick 方法看起来很轻,不值得额外线程的开销。

关于java - 为什么我在没有使用 android.os.CountDownTimer 调用 Looper.prepare() 的线程中得到一个 "Can' t 创建处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3430990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com