美文网首页
转:activity/fragment Paused时处理Han

转:activity/fragment Paused时处理Han

作者: wyonxue | 来源:发表于2017-09-07 14:00 被阅读0次

    原地址:StackOverFlow上答案

    通过实现一个关注Activity/Fragment Paused状态的Handler,在Paused时储存Message,Resume时再处理该Message的方式。
    详细内容请参考上面原答案地址。
    下面是代码:

    /**
     * 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
         */
        final Vector<Message> messageQueueBuffer = new Vector<Message>();
    
        /**
         * Flag indicating the pause state
         */
        private boolean paused;
    
        /**
         * Resume the handler
         */
        final public void resume() {
            paused = false;
    
            while (messageQueueBuffer.size() > 0) {
                final Message msg = messageQueueBuffer.elementAt(0);
                messageQueueBuffer.removeElementAt(0);
                sendMessage(msg);
            }
        }
    
        /**
         * Pause the handler
         */
        final public void pause() {
            paused = true;
        }
    
        /**
         * Notification that the message is about to be stored as the activity is
         * paused. If not handled the message will be saved and replayed when the
         * activity resumes.
         * 
         * @param message
         *            the message which optional can be handled
         * @return true if the message is to be stored
         */
        protected abstract boolean storeMessage(Message message);
    
        /**
         * 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 message
         *            the message to be handled
         */
        protected abstract void processMessage(Message message);
    
        /** {@inheritDoc} */
        @Override
        final public void handleMessage(Message msg) {
            if (paused) {
                if (storeMessage(msg)) {
                    Message msgCopy = new Message();
                    msgCopy.copyFrom(msg);
                    messageQueueBuffer.add(msgCopy);
                }
            } else {
                processMessage(msg);
            }
        }
    }
    

    使用时:

    public class FragmentTestActivity extends Activity {
    
        /**
         * Used for "what" parameter to handler messages
         */
        final static int MSG_WHAT = ('F' << 16) + ('T' << 8) + 'A';
        final static int MSG_SHOW_DIALOG = 1;
    
        int value = 1;
    
        final static class State extends Fragment {
    
            static final String TAG = "State";
            /**
             * Handler for this activity
             */
            public ConcreteTestHandler handler = new ConcreteTestHandler();
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setRetainInstance(true);            
            }
    
            @Override
            public void onResume() {
                super.onResume();
    
                handler.setActivity(getActivity());
                handler.resume();
            }
    
            @Override
            public void onPause() {
                super.onPause();
    
                handler.pause();
            }
    
            public void onDestroy() {
                super.onDestroy();
                handler.setActivity(null);
            }
        }
    
        /**
         * 2 second delay
         */
        final static int DELAY = 2000;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            if (savedInstanceState == null) {
                final Fragment state = new State();
                final FragmentManager fm = getFragmentManager();
                final FragmentTransaction ft = fm.beginTransaction();
                ft.add(state, State.TAG);
                ft.commit();
            }
    
            final Button button = (Button) findViewById(R.id.popup);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    final FragmentManager fm = getFragmentManager();
                    State fragment = (State) fm.findFragmentByTag(State.TAG);
                    if (fragment != null) {
                        // Send a message with a delay onto the message looper
                        fragment.handler.sendMessageDelayed(
                                fragment.handler.obtainMessage(MSG_WHAT, MSG_SHOW_DIALOG, value++),
                                DELAY);
                    }
                }
            });
        }
    
        public void onSaveInstanceState(Bundle bundle) {
            super.onSaveInstanceState(bundle);
        }
    
        /**
         * Simple test dialog fragment
         */
        public static class TestDialog extends DialogFragment {
    
            int value;
    
            /**
             * Fragment Tag
             */
            final static String TAG = "TestDialog";
    
            public TestDialog() {
            }
    
            public TestDialog(int value) {
                this.value = value;
            }
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                final View inflatedView = inflater.inflate(R.layout.dialog, container, false);
                TextView text = (TextView) inflatedView.findViewById(R.id.count);
                text.setText(getString(R.string.count, value));
                return inflatedView;
            }
        }
    
        /**
         * Message Handler class that supports buffering up of messages when the
         * activity is paused i.e. in the background.
         */
        static class ConcreteTestHandler extends PauseHandler {
    
            /**
             * Activity instance
             */
            protected Activity activity;
    
            /**
             * Set the activity associated with the handler
             * 
             * @param activity
             *            the activity to set
             */
            final void setActivity(Activity activity) {
                this.activity = activity;
            }
    
            @Override
            final protected boolean storeMessage(Message message) {
                // All messages are stored by default
                return true;
            };
    
            @Override
            final protected void processMessage(Message msg) {
    
                final Activity activity = this.activity;
                if (activity != null) {
                    switch (msg.what) {
    
                    case MSG_WHAT:
                        switch (msg.arg1) {
                        case MSG_SHOW_DIALOG:
                            final FragmentManager fm = activity.getFragmentManager();
                            final TestDialog dialog = new TestDialog(msg.arg2);
    
                            // We are on the UI thread so display the dialog
                            // fragment
                            dialog.show(fm, TestDialog.TAG);
                            break;
                        }
                        break;
                    }
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:转:activity/fragment Paused时处理Han

          本文链接:https://www.haomeiwen.com/subject/wbrijxtx.html