作为菜鸡,一遇到这种BUG就一脸懵逼,最后还是疯狂的查询百度,得到了这样的解决方法,记录一下,自己测试是可行的。
首先一开始报错的代码是这样的:
@Override
public void onClick(View v) {
if (0 != musicProgressBar.getProgress()) {
// TODO Auto-generated method stub
startService();//自己写了个方法包装了开启服务+Toast
//倒计时
new Timer().schedule(new TimerTask() {
@Override
public void run() {
if(time > 0){
//在这里musicProgressBar是一个圆形的拖动条,setProgress是设置拖动条当前的值
musicProgressBar.setProgress(--time);
if(0 == time){
//问题就出在这句Toast里
Toast.makeText(this, "时间到", Toast.LENGTH_SHORT).show(); cancel();
}
}
}
}, 60*1000, 60*1000);
}else{
Toast.makeText(this, "您还没有选择时间", Toast.LENGTH_SHORT).show();
}
}
Can't create handler inside thread that has not called Looper.prepare()
我一开始也以为和Looper.prepare()这个方法有关,查了百度之后发现,Android好像不能再线程中更新UI,这句话我也不是很懂,然后需要把更新UI的这个过程放到主线程里,所以需要用到Handler这个东西,大概意思就是可以在其他线程(类似于Thread和Timer)中使用Handler 和Message。在需要更新UI(目前只知道Toast)的地方,使用Handler将一个Message发送出去,在主线程中接收这个Message,接收到之后就使用Toast或者其他更新UI的事情,大致原理就是这样。
以下是更改之后的代码
MainActivity中,设置Message的接受,以及Toast事件
private Handler mHandler;
mHandler=new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case ID_USER:
//获取传递的数据
Bundle data = msg.getData();
String text = data.getString("str");
//处理UI更新等操作
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
stopService();
}
};
};
@Override
public void onClick(View v) {
if (0 != musicProgressBar.getProgress()) {
// TODO Auto-generated method stub
startService();
//执行数据操作,不涉及到UI
//倒计时
new Timer().schedule(new TimerTask() {
@Override
public void run() {
/**
* 用一个Handler来处理Toast
*/
Message msg = new Message(); //创建一个Message
msg.what = ID_USER; //给这个Message一个标识
Bundle data = new Bundle(); //创建一个数据包
if(time > 0){
//在这里musicProgressBar是一个圆形拖动条,setProgress()是设定当前拖动位置
musicProgressBar.setProgress(--time);
if(0 == time){
//把这个数据包添加一个Key为str,后面这一段是我想要Toast的话
data.putString("str", "Times up! you can take a break!");
//添加这段数据包到Message里
msg.setData(data);
//使用Handler将Message发送出去
mHandler.sendMessage(msg);
cancel();
}
}
}
}, 60*1000, 60*1000);
}else{
Toast.makeText(this, "您还没有选择时间", Toast.LENGTH_SHORT).show();
}
}
最后这个错误就解决了,而且Toast也能显示出来。本人菜鸡一个,有错误可以指出来,谢谢