Service和IntentService中显示Toast的区别

1. 表象


Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失。

2. 原因

Toast要求运行在UI主线程中。

Service运行在主线程中,因此Toast是正常的。

IntentService运行在独立的线程中,因此Toast不正常。

3. 在IntentService中显示Toast

利用Handler,将显示Toast的工作,放在主线程中来做。具体有两个实现方式。

Handler的post方式实现,这个方式比较简单。

    private void showToastByRunnable(final IntentService context, final CharSequence text, final int duration)     {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, text, duration).show();
            }
        });
    }

Handler的msg方式实现,这个方式比较复杂。

    Handler msgHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(ToastIntentService.this, msg.getData().getString("Text"), Toast.LENGTH_SHORT).show();
            super.handleMessage(msg);
        }
    };
    private void showToastByMsg(final IntentService context, final CharSequence text, final int duration) {
        Bundle data = new Bundle();
        data.putString("Text", text.toString());
        Message msg = new Message();
        msg.setData(data);
        msgHandler.sendMessage(msg);
    }

4. 关于耗时操作

Service中如果有耗时的操作,要开启一个Thread来做。

IntentService是在独立的线程中,所以可以进行一些耗时操作。

5. 考虑AsyncTask与Service的使用区别

如果是全后台的工作,使用Service,结果的提示可以使用Notification。

如果是异步工作,工作结束后需要更新UI,那么最好使用Thread或者AsyncTask。

6. 参考

Android Handler机制详解

http://developer.android.com/reference/android/os/Handler.html

深入理解ANDROID消息处理系统——LOOPER、HANDLER、THREAD

时间: 2024-10-27 13:16:21

Service和IntentService中显示Toast的区别的相关文章

在IntentService中使用Toast与在Service中使用Toast的异同

1. 表象 Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失. 2. 问题分析 查阅Android官方文档可以发现: Public Constructors public Toast (Context context) Since: API Level 1 Construct an empty Toast object. You must call setView(View)

Android在非UI线程中显示Toast

[java] view plaincopyprint? public void showToast(String msg){ Looper.prepare(); Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); Looper.loop(); } public void showToast(String msg){ Looper.prepare(); Toast.makeText(getApplicat

Android学习笔记----TimerTask中显示Toast的问题

今天想在TimerTask的run函数中调用Toast显示一下提示信息,却总是导致程序崩溃.可是try语句块却又无法捕获到异常,代码如下: ...... Timer timer = new Timer(); TimerTask sampleTask = null; ...... if (sampleTask==null){ sampleTask = new TimerTask() { @Override public void run() { Toast.makeText(getApplicat

service与IntentService 区别

关系: IntentService继承service 区别: IntentService 是一个带有HandlerThread的线程的service,把任务执行完成以后IntentService自动销毁. Service要手动 调用stopSelf()来销毁. IntentService 运行在子线程中,Service运行在主线程中 作用:  IntentService 用于执行一次复杂的场景使用IntentService相对好一点 Service 用于重复执行的场景 代码分析: IntentS

在 VS 类库项目中 Add Service References 和 Add Web References 的区别

原文:在 VS 类库项目中 Add Service References 和 Add Web References 的区别 出身问题: 1.在vs2005时代,Add Web Reference(添加Web服务引用)的功能主要是添加Web Service引用.基于.NET Framework 2.0. 2.自VS2008以后,为了对.NET Framework 3.0 或 3.5版本上WCF Service Library的支持.增加了Add Service Reference(添加服务引用)功

Toast的用法(可以设置显示时间,自定义布局的,线程中的Toast)

       自定义的Toast类 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="10dp" android

自定义圆形滚动条(在自定义标题栏中显示)--利用开源项目ProgressWheel(二)

本篇是ProgressWheel使用的第二篇(尾篇),功能是在自定义标题栏中显示ProgressWheel滚动条. 本篇引用的开源项目依然是ProgressWheel,地址: https://github.com/Todd-Davies/ProgressWheel 本篇效果图: 自定义滚动条(在自定义标题栏中显示)的实现: 1)activity_progress_wheel_test. xml: <RelativeLayout xmlns:android="http://schemas.a

IntentService中使用Toask报错sending message to a Handler on a dead thread

在自己IntentSevice继承类中的onHandleIntent方法中写Toast.makeText(getApplicationContext(), "sd不存在", Toast.LENGTH_SHORT).show();时不会有任何提示,logcat中提示"sending message to a Handler on a dead thread"错误.后从网上差报错原因了解到当一个线程的消息循环已经退出后,不能再给其发送消息不如就会报错.后有从一个网站找到

在Android 窗口小组件(Widget)中显示(StackView,ListView,GridView)集合View

在Android 3.0 中引入了 Collection View Widget.用于在窗口小组件中添加了对集合View 的支持. 如下: (1)StackView 一个卡片View,以层叠的方式显示其子View. (2)ListView 和传统的ListView一样 (3)GridView 网格列表.具体用法和传统的一样. 第一步:创建Widget布局文件    (1)Wdiget的布局文件 路径:res/layout/my_widget_layout.xml <?xml version=&quo