java– 为什么我得到一个“无法使用android.os.CountDownTimer在没有调用Looper.prepare()的线程中创建处理程序”?

java– 为什么我得到一个“无法使用android.os.CountDownTimer在没有调用Looper.prepare()的线程中创建处理程序”?,第1张

概述使用这个类时,我得到了这个奇怪的异常.它用于为我的游戏打印出漂亮的计时器显示,并在创建我的主GameView类时创建.错误在第26行抛出:super(s*1000,1000);packagetommedley.android.game;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.gra

使用这个类时,我得到了这个奇怪的异常.它用于为我的游戏打印出漂亮的计时器显示,并在创建我的主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;    }}

解决方法:

这有点奇怪 – 我认为你必须在主线程以外的线程上构建这个对象?

我不知道你是否熟悉Handlers和Loopers,但它们是AndroID在线程上进行异步 *** 作的方式.如果要在线程上执行异步 *** 作,可以使用Handler来执行此 *** 作.但在使用Handler之前,必须通过创建MessageQueue来准备线程,这可以通过调用Looper.prepare()来完成.

如果你看一下the source的CountDownTimer类,你会发现它创建了一个私有的Handler实例.这个成员变量是在构造函数执行之前直接创建的,这就是在调用super时抛出异常的原因.

因此,您需要做的就是在构造Timer之前调用Looper.prepare().但是,如果在主线程上构造Timer,则不需要执行此 *** 作. AndroID进程的主线程被自动声明为looper(如果你已经在主线程上调用它并仍然得到这个异常,那确实非常奇怪).据我所知,稀疏的javadocs,这个类本意在主线程上使用,所以我建议这样做.你的onTick方法似乎足够轻,以至于不值得额外线程的开销.

总结

以上是内存溢出为你收集整理的java – 为什么我得到一个“无法使用android.os.CountDownTimer在没有调用Looper.prepare()的线程中创建处理程序”?全部内容,希望文章能够帮你解决java – 为什么我得到一个“无法使用android.os.CountDownTimer在没有调用Looper.prepare()的线程中创建处理程序”?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1109260.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存