Service和IntentService中显示Toast的区别

来源:互联网 发布:网络唤醒开机关闭 编辑:程序博客网 时间:2024/05/17 23:10
本文链接     http://blog.csdn.net/xiaodongrush/article/details/9628849

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

原创粉丝点击