【Android】永不消失的Toast
来源:互联网 发布:达内培训 编程软件 编辑:程序博客网 时间:2024/05/16 01:00
Toast是Android一个比较省心的控件,因为Toast不提供任何交互界面,看一眼就消失,而且只需要Context就可以创建。
然而无须交互的优势这也带来一个问题,如果Toast显示后无法消失,那么将真的是无法消失了。除非强制退出应用或者重启手机。
一个简单的示例程序,就可以创造出一个无法消失的Toast。以下为Activity代码:
public class ToastTestActivity extends Activity {/** HandlerThread object */ HandlerThread mThread = null; /** Handler object */ ToastHandler mHandler = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mThread = new HandlerThread("ToastThread"); mThread.start(); mHandler = new ToastHandler(mThread.getLooper()); } /** * Called when Button got clicked * @param v View that got clicked */ public void myClick(View v) { mHandler.sendEmptyMessageDelayed(1, 2000); } private class ToastHandler extends Handler { public ToastHandler(Looper looper) { super(looper); } public void handleMessage(Message msg) { super.handleMessage(msg); Toast toast = Toast.makeText(ToastTestActivity.this, "Dismiss me", Toast.LENGTH_LONG); toast.show(); } } @Override protected void onDestroy() { super.onDestroy(); mHandler.removeMessages(1); mThread.getLooper().quit(); mHandler = null; mThread = null; }}
该Activity有一个Button, 点击之后会向HandlerThread发送一个延时消息,Handler处理该消息时会创建并显示一个Toast,当Toast正在显示的时候,点Back键退出Activity。就会发现正在显示的Toast不会消失。
原因:
罪魁祸首就是HandlerThread在onDestroy方法里面调用了HandlerThread.getLooper().quit()。因为Toast在创建的时候,会同时创建一个基于当前线程的Handler对象,虽然NotificationManagerService负责调度Toast,但是真正显示和隐藏Toast都是向这个Handler发送消息。也就是说Toast做事情也用到了HandlerThread的Looper。所以如果单纯在onDestroy方法里将Looper给quit的话,Toast将无法实现隐藏。
解决方案:
个人感觉让Toast远离HandlerThread比较靠谱。可以统一规范代码,所有显示Toast的代码都post到主线程(无论是Activity还是Service)当中,因为主线程的Looper不会轻易quit,至少不会允许开发者显示quit。
- 【Android】永不消失的Toast
- 【Android】永不消失的Toast
- android 永不关闭toast
- Android开发技巧:永不关闭的Toast信息框
- Android开发技巧:永不关闭的Toast信息框
- Android开发技巧:永不关闭的Toast信息框
- Android开发技巧:永不关闭的Toast信息框
- android自定义Toast的显示时间与消失
- 自定义View----不消失的Toast
- android 自定义Toast & 如何使Toast随Activity消失而消失
- 控制toast出现位置以及progressbar的出现消失
- 连续弹出的多个Toast长时间显示,不消失。
- android-Toast的用法
- Android的各种Toast
- Android Toast 的用法
- 【android】Toast 的用法
- Android:自定义的Toast
- android的Toast
- asdasd
- Android学习笔记:Bound Services
- 2222222222222
- 运放主要参数
- 一款海量美女壁纸及内涵漫画于一身的android应用
- 【Android】永不消失的Toast
- 深入浅出Cocoa之Framework
- TWaver图形界面之道(一)序言与目录
- linux 下tomcat开机自启动
- IOS多线程,同步总结
- RTP/RTCP/RTSP/RTVP等流媒体协议
- mysql中utf8_general_cs和utf8_general_ci和utf8_bin的一点区别
- Java Web项目管理得失谈(转载)
- STL prev_permutation&next_permutation