关于 Toast 触发android的线程问题

public class ToastUtil {
private static Toast toast = null;
public static void showToast(Context context,String content){
if (toast != null){
toast.cancel();

    }
            Looper.prepare();
    toast = Toast.makeText(context,content,Toast.LENGTH_SHORT);
    toast.show();
    Looper.loop();
}

public static void showToast(Context context,int resid){
    showToast(context,context.getString(resid));
}

}
这是我封装的Toast的代码,其实也就是在网上下载的,我是定义了一个接口,接口里面会用到这个方法,然后接口的方法会在Asynctask中使用,有的时候就会报错toast Can't create handler inside thread that has not called Looper.prepare(),然后在网上搜索,网上的说在 toast = Toast.makeText(context,content,Toast.LENGTH_SHORT);
toast.show();前面加上Looper.prepare();后面加上 Looper.loop();(刚开始我是没有加的),然后就会报错Only one Looper may be created per thread。。。
这是为什么啊?

4个回答

asynctask的实现机制在不同API版本里是有区别的,你使用的是哪个版本的?而且你是在asynctask的哪个回调方法里showtoast的?

stone_you
stone_you 是的,doinbackground是跑在工作线程的,这个线程里是没有loop的,所以会报你的第一个错误。你后来改的那个加了loop,这种方式是错误的,只能在线程里加loop,不是你这样写的。
2 年多之前 回复
qq_35071078
下课睡觉 我知道怎么回事了,我把接口的回调放在doinbackground里面了,才会报这种错误,应该放在o'n'po's'texcute里面就ok了
2 年多之前 回复

你百度一下,用Android的handler,在要弹toast的地方sendemptymessage,在handler的处理消息函数里用toast

口的回调放在doinbackground里面,处理在子线程中了

showToast属于ui操作,你在非UI线程调用怎么能不报错,还有doInbackgroud是子线程处理耗时的,你试着放到postXX下看看,还有这个封装有必要么?

qq_35071078
下课睡觉 这还是有的吧,比较方便啊、、
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!