转:Service和IntentService中显示Toast的区别

转自:https://www.cnblogs.com/dyllove98/archive/2013/07/30/3225944.html

1. 表象

 

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

 

2. 原因

 

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

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

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

 

3. IntentService中显示Toast

 

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

 

    Handlerpost方式实现,这个方式比较简单。

    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();

            }

        });

    }

 

    Handlermsg方式实现,这个方式比较复杂。

    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. 考虑AsyncTaskService的使用区别

    

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

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

 

6. 参考

 

    Android Handler机制详解

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

     深入理解ANDROID消息处理系统——LOOPERHANDLERTHREAD

 

猜你喜欢

转载自blog.csdn.net/sinat_30457013/article/details/89381324
今日推荐