java – 为什么我得到一个“无法使用android.os.CountDownTimer在没有调用Looper.prepare()的线程中创建处理程序”?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么我得到一个“无法使用android.os.CountDownTimer在没有调用Looper.prepare()的线程中创建处理程序”?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3025字,纯文字阅读大概需要5分钟。
内容图文
![java – 为什么我得到一个“无法使用android.os.CountDownTimer在没有调用Looper.prepare()的线程中创建处理程序”?](/upload/InfoBanner/zyjiaocheng/730/1713b69d21c047338082436120a6da18.jpg)
使用这个类时,我得到了这个奇怪的异常.它用于为我的游戏打印出漂亮的计时器显示,并在创建我的主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()的线程中创建处理程序”?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。