Service上Toast

作为一个1年多的android开发师来说一直在感受着世界深深的恶意

比如说我们的项目里曾经要在链接打印机操作的service上显示打印机打印成功和失败的Toast,然后突然发现service上的toast不能显示

突然发现是因为实例化service没有直接操作主线程(也就是ui线程,我们都知道ui线程是显示控件的线程)。

通过查阅资料找到了我的老朋友去帮忙解决这个问题了就是---handler消息分发机制。

是怎么做的呢?

请看代码


在这种情况下Handler执行Runnable的run();方法从而实现在Service上显示Toast

为何呢?

看源码:

	// TODO Auto-generated method stub
		Handler  mHandler=new Handler(Looper.getMainLooper());//看源码就知道其实知道Handler一定会创建一个Looper对象
		mHandler.post(new Runnable() {//是线程对象不错但是handler只会去执行runnable的run方法
			
			@Override
			public void run() {
				Toast.makeText(getApplicationContext(), "service", Toast.LENGTH_LONG).show();
			}
		});


  


同学们请注意注释上说的Looper对象必须不能为null

也就是说在这里不能传null;

看源码可以知道虽然我们new 了一个runnable对象实际上在最后还是在当前looper线程内分发了一个消息。

最后会被当前线程所在的messagequeues.enqueuemessage到它的消息队列内。

而最后ui线程内的消息都会被ui线程处理。

所以就可以同过Handler在Service内显示一个Toast。


发布了4 篇原创文章 · 获赞 0 · 访问量 506
展开阅读全文

关于Toast的构造函数和获取当前Activity的问题

04-11

## **最近写一个自定义的Toast,需要在service里面调用这个自定义的类,源码如下;** ``` public class MyToast { private Activity context; public MyToast(Activity mcontext){ this.context=mcontext; } //在主线程和子线程中显示 public void showMyToast(final String messages) { if ("main".equals(Thread.currentThread().getName())) { showToast(messages); } else { context.runOnUiThread(new Runnable() { @Override public void run() { showToast(messages); } }); } } //toast初始化和布局 private void showToast(final String text){ Toast toast =new Toast(context); LayoutInflater inflater =context.getLayoutInflater(); View toastLayout=inflater.inflate(R.layout.mytoast,(ViewGroup)context.findViewById(R.id.toast)); TextView textView=(TextView)toastLayout.findViewById(R.id.toastText); textView.setText(text); toast.setGravity(Gravity.BOTTOM,0,0); toast.setDuration(Toast.LENGTH_SHORT); toast.setView(toastLayout); toast.show(); } } ``` # **现在有个问题就是,我这个类需要传入一个Activity的上下文,但是我搜索了好些方法,在service里获取当前Activity都不太理想,于是我便想参考系统的Toast方法(因为在service里使用Toast可以直接传入service的上下文),更改一下我的类中的上下文,系统的Toast方法如下**: ![图片说明](https://img-ask.csdn.net/upload/201904/11/1554955045_585781.png) # **可以看见这里使用的构造方法与我不一样,那么看一下构造方法:** ![图片说明](https://img-ask.csdn.net/upload/201904/11/1554955123_217449.png) # **但是奇怪的是,当我自己写的时候就出问题了,Toast mytoast=new Toast(context,looper);这一句就会报错,提示没有这个方法,我在网上看其他的Toast说明却发现构造方法不一样!如下:** ![图片说明](https://img-ask.csdn.net/upload/201904/11/1554955286_818257.png) # **希望有哪位大佬帮我解决一下!就是要么将Toast改成全局的,即传入的上下文为Context类型,要么就是教教我怎么在service里获取当前的Activity,不胜感激!** 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览