
使用这个类时,我得到了这个奇怪的异常.它用于为我的游戏打印出漂亮的计时器显示,并在创建我的主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()的线程中创建处理程序”?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)