为了账号安全,请及时绑定邮箱和手机立即绑定

活动/片段暂停时如何处理处理程序消息

活动/片段暂停时如何处理处理程序消息

慕运维8079593 2019-10-23 14:21:32
我的其他帖子略有变化基本上我有一个消息Handler在我的Fragment接收一串可导致对话消息被解雇或示出。当应用程序进入后台时,我得到一个提示,onPause但仍然如我所愿地通过我的消息。但是,因为我使用的是片段,所以我不能只关闭并显示对话框,因为这将导致IllegalStateException。我不能只是解雇或取消允许状态丢失。鉴于我有一个问题,Handler我想知道是否有关于在暂停状态下如何处理消息的推荐方法。我正在考虑的一种可能的解决方案是记录暂停时通过的消息并在上播放它们onResume。这有点不能令人满意,我想框架中必须有一些东西可以更优雅地处理它。
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

quickdraw出色的PauseHandler的一个稍微简单的版本是


/**

 * Message Handler class that supports buffering up of messages when the activity is paused i.e. in the background.

 */

public abstract class PauseHandler extends Handler {


    /**

     * Message Queue Buffer

     */

    private final List<Message> messageQueueBuffer = Collections.synchronizedList(new ArrayList<Message>());


    /**

     * Flag indicating the pause state

     */

    private Activity activity;


    /**

     * Resume the handler.

     */

    public final synchronized void resume(Activity activity) {

        this.activity = activity;


        while (messageQueueBuffer.size() > 0) {

            final Message msg = messageQueueBuffer.get(0);

            messageQueueBuffer.remove(0);

            sendMessage(msg);

        }

    }


    /**

     * Pause the handler.

     */

    public final synchronized void pause() {

        activity = null;

    }


    /**

     * Store the message if we have been paused, otherwise handle it now.

     *

     * @param msg   Message to handle.

     */

    @Override

    public final synchronized void handleMessage(Message msg) {

        if (activity == null) {

            final Message msgCopy = new Message();

            msgCopy.copyFrom(msg);

            messageQueueBuffer.add(msgCopy);

        } else {

            processMessage(activity, msg);

        }

    }


    /**

     * Notification message to be processed. This will either be directly from

     * handleMessage or played back from a saved message when the activity was

     * paused.

     *

     * @param activity  Activity owning this Handler that isn't currently paused.

     * @param message   Message to be handled

     */

    protected abstract void processMessage(Activity activity, Message message);


}

它确实假定您始终要存储脱机消息以进行重播。并提供“活动”作为输入,#processMessages因此您无需在子类中对其进行管理。


查看完整回答
反对 回复 2019-10-23
  • 3 回答
  • 0 关注
  • 499 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信