《世界守则》UI一片

注形容自己用语言 android学习之路

转载请保留出处 by Qiao

http://blog.csdn.net/qiaoidea/article/details/46402845

【导航】

- 弹出式对话框各种方案 从仿QQ消息提示框来谈弹出式对话框的实现方式 (Dialog,PopupWind,自己定义View,Activity。FragmentDialog)

- Dialog源代码解析 从源代码上看Dialog与DialogFragment


1.概述

  前一篇写了经常使用的弹出框的几种实现方式,这里通过源代码来简要解析下Dialog的实现原理。后便作为补充会讲下官方提倡的FragmentDialog。


2.源代码解析

  通常创建非堵塞式对话框的方式就是使用dialog了。只是在Android 3.0 之后,google更推荐使用新引入的基于Fragment的DialogFragment。

这里我们从源代码层次来看下具体实现。

2.1 Dialog

1.DialogInterface

  Dialog对话框实现的接口有DialogInterface,Window.Callback, keyEvent.Callback,OnCreateContextMenuListener,后边几个主要的Activity、View等组件都或多或少实现了。这里側重讲下Dialog专有的DialogInterface。

  1. public interface DialogInterface {
  2. public static final int BUTTON_POSITIVE = -1;
  3. public static final int BUTTON_NEGATIVE = -2;
  4. public static final int BUTTON_NEUTRAL = -3;
  5. @Deprecated
  6. public static final int BUTTON1 = BUTTON_POSITIVE;
  7. @Deprecated
  8. public static final int BUTTON2 = BUTTON_NEGATIVE;
  9. @Deprecated
  10. public static final int BUTTON3 = BUTTON_NEUTRAL;
  11. public void cancel();
  12. public void dismiss();
  13. interface OnCancelListener {
  14. public void onCancel(DialogInterface dialog);
  15. }
  16. interface OnDismissListener {
  17. public void onDismiss(DialogInterface dialog);
  18. }
  19. interface OnShowListener {
  20. public void onShow(DialogInterface dialog);
  21. }
  22. interface OnClickListener {
  23. public void onClick(DialogInterface dialog, int which);
  24. }
  25. interface OnMultiChoiceClickListener {
  26. public void onClick(DialogInterface dialog, int which, boolean isChecked);
  27. }
  28. interface OnKeyListener {
  29. public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event);
  30. }
  31. }

  比較简单易懂。没什么要说的,定义了最主要的接口方法。一目了然。具体设置和使用都在在Dialog中具体实现。

2.Dialog全局变量

  相同比較清晰容易理解,只是多解释。

  1. private static final String TAG = "Dialog";
  2. private Activity mOwnerActivity;//关联和创建它的activity
  3. final Context mContext;
  4. final WindowManager mWindowManager;
  5. Window mWindow;
  6. View mDecor;
  7. private ActionBarImpl mActionBar;
  8. protected boolean mCancelable = true;
  9. private String mCancelAndDismissTaken;
  10. private Message mCancelMessage;//取消指令
  11. private Message mDismissMessage;//消失指令
  12. private Message mShowMessage;//显示指令
  13. private OnKeyListener mOnKeyListener;//点击事件
  14. private boolean mCreated = false;
  15. private boolean mShowing = false;
  16. private boolean mCanceled = false;
  17. private final Handler mHandler = new Handler();
  18. private static final int DISMISS = 0x43;
  19. private static final int CANCEL = 0x44;
  20. private static final int SHOW = 0x45;
  21. private Handler mListenersHandler;//消息指令接受处理handler
  22. private ActionMode mActionMode;

3.Dialog构造方法

  基本全部的缺省构造方法都是最后调用到这里:

  1. Dialog(Context context, int theme, boolean createContextThemeWrapper) {
  2. if (createContextThemeWrapper) {
  3. if (theme == 0) {
  4. TypedValue outValue = new TypedValue();
  5. context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme,
  6. outValue, true);
  7. theme = outValue.resourceId;
  8. }
  9. mContext = new ContextThemeWrapper(context, theme);
  10. } else {
  11. mContext = context;
  12. }
  13. mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
  14. Window w = PolicyManager.makeNewWindow(mContext);
  15. mWindow = w;
  16. w.setCallback(this);
  17. w.setWindowManager(mWindowManager, null, null);
  18. w.setGravity(Gravity.CENTER);
  19. mListenersHandler = new ListenersHandler(this);
  20. }

  theme为零,则使用系统定义的主题风格,createContextThemeWrapper表示是否使用自己的主题风格。

  然后初始化窗口管理器和消息指令处理handler。

  贴上它的缺省构造方法:

  1. public Dialog(Context context) {
  2. this(context, 0, true);
  3. }
  4. public Dialog(Context context, int theme) {
  5. this(context, theme, true);
  6. }
  7. @Deprecated
  8. protected Dialog(Context context, boolean cancelable,
  9. Message cancelCallback) {
  10. this(context);
  11. mCancelable = cancelable;
  12. mCancelMessage = cancelCallback;
  13. }
  14. protected Dialog(Context context, boolean cancelable,
  15. OnCancelListener cancelListener) {
  16. this(context);
  17. mCancelable = cancelable;
  18. setOnCancelListener(cancelListener);
  19. }

4.Dialog显示 show()

  通过加入dialog至根视图并附加到window窗口中去,同一时候发送dialog显示的消息指令。

  1. public void show() {
  2. /**
  3. * 假设已经显示了,则重绘actionBar并显示根视图View mDecor
  4. */
  5. if (mShowing) {
  6. if (mDecor != null) {
  7. if (mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {
  8. mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR);
  9. }
  10. mDecor.setVisibility(View.VISIBLE);
  11. }
  12. return;
  13. }
  14. mCanceled = false;//设置取消状态为false
  15. /**
  16. * 假设Dialog没有被创建和初始化则调用dispatchOnCreate创建操作
  17. */
  18. if (!mCreated) {
  19. dispatchOnCreate(null);
  20. }
  21. /**
  22. * 初始化ActionBar动画效果和 根视图View
  23. */
  24. onStart();
  25. mDecor = mWindow.getDecorView();
  26. /**
  27. * 初始化ActionBar文本图片
  28. */
  29. if (mActionBar == null && mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {
  30. final ApplicationInfo info = mContext.getApplicationInfo();
  31. mWindow.setDefaultIcon(info.icon);
  32. mWindow.setDefaultLogo(info.logo);
  33. mActionBar = new ActionBarImpl(this);
  34. }
  35. //依据输入法模式来载入布局參数
  36. WindowManager.LayoutParams l = mWindow.getAttributes();
  37. if ((l.softInputMode
  38. & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
  39. WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
  40. nl.copyFrom(l);
  41. nl.softInputMode |=
  42. WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
  43. l = nl;
  44. }
  45. //加入根视图View到窗口,发送显示指令
  46. try {
  47. mWindowManager.addView(mDecor, l);
  48. mShowing = true;
  49. sendShowMessage();//显示消息指令
  50. } finally {
  51. }
  52. }
  53. //设置同意ActionBar的显示隐藏动画
  54. protected void onStart() {
  55. if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(true);
  56. }
  57. //从消息池去一条消息,发送显示指令给目标handler
  58. private void sendShowMessage() {
  59. if (mShowMessage != null) {
  60. Message.obtain(mShowMessage).sendToTarget();
  61. }
  62. }

  说到这里最好还是看一下处理消息指令的handler和其具体逻辑。

5.ListenersHandler

  不了解Hanler的同学能够參考一下前面在线程更新UI时候讲到的 消息处理系统模型,当中有关于hanlder的简要解说。

  这里看ListenersHandler 的具体逻辑,事实上非常easy。就是调用对应的接口监听事件:

  1. private static final class ListenersHandler extends Handler {
  2. private WeakReference<DialogInterface> mDialog;
  3. public ListenersHandler(Dialog dialog) {
  4. mDialog = new WeakReference<DialogInterface>(dialog);
  5. }
  6. @Override
  7. public void handleMessage(Message msg) {
  8. switch (msg.what) {
  9. case DISMISS:
  10. ((OnDismissListener) msg.obj).onDismiss(mDialog.get());
  11. break;
  12. case CANCEL:
  13. ((OnCancelListener) msg.obj).onCancel(mDialog.get());
  14. break;
  15. case SHOW:
  16. ((OnShowListener) msg.obj).onShow(mDialog.get());
  17. break;
  18. }
  19. }
  20. }

6.Dialog的hide()

  方法非常easy,仅仅是让根视图不可见:

  1. public void hide() {
  2. if (mDecor != null) {
  3. mDecor.setVisibility(View.GONE);
  4. }
  5. }

  真正让dialog移除和消失的是dismiss()方法:

6.Dialog的dismiss()

  1. 假设当前线程不是mHandler所在线程,则通过发送消息处理。终于都是运行dismissDialog()方法:
  1. @Override
  2. public void dismiss() {
  3. if (Looper.myLooper() == mHandler.getLooper()) {
  4. dismissDialog();
  5. } else {
  6. mHandler.post(mDismissAction);
  7. }
  8. }
  9. void dismissDialog() {
  10. /**
  11. *假设根视图为空或者当前dialog并没有显示,直接返回
  12. */
  13. if (mDecor == null || !mShowing) {
  14. return;
  15. }
  16. //假设当前窗口已经destoryed掉。直接返回
  17. if (mWindow.isDestroyed()) {
  18. Log.e(TAG, "Tried to dismissDialog() but the Dialog's window was already destroyed!");
  19. return;
  20. }
  21. /**
  22. *首先移除根视图View,调用mActionMode的finish()方法,然后清空窗口。改变显示状态并发送dialog消失指令
  23. */
  24. try {
  25. mWindowManager.removeViewImmediate(mDecor);
  26. } finally {
  27. if (mActionMode != null) {
  28. mActionMode.finish();
  29. }
  30. mDecor = null;
  31. mWindow.closeAllPanels();
  32. onStop();
  33. mShowing = false;
  34. sendDismissMessage();
  35. }
  36. }
  37. //关闭ActionBar的动画效果
  38. protected void onStop() {
  39. if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
  40. }
  41. private void sendDismissMessage() {
  42. if (mDismissMessage != null) {
  43. // Obtain a new message so this dialog can be re-used
  44. Message.obtain(mDismissMessage).sendToTarget();
  45. }
  46. }

7.Dialog取消cancel()

  1. 改动状态并发送消息,最后调用的是dismiss()方法
  1. public void cancel() {
  2. if (!mCanceled && mCancelMessage != null) {
  3. mCanceled = true;
  4. Message.obtain(mCancelMessage).sendToTarget();
  5. }
  6. dismiss();
  7. }

8.Dialog状态保存与恢复

  1. private static final String DIALOG_SHOWING_TAG = "android:dialogShowing";
  2. private static final String DIALOG_HIERARCHY_TAG = "android:dialogHierarchy";
  3. /**
  4. * 保存dialog当前状态
  5. */
  6. public Bundle onSaveInstanceState() {
  7. Bundle bundle = new Bundle();
  8. bundle.putBoolean(DIALOG_SHOWING_TAG, mShowing);
  9. if (mCreated) {
  10. bundle.putBundle(DIALOG_HIERARCHY_TAG, mWindow.saveHierarchyState());
  11. }
  12. return bundle;
  13. }
  14. /**
  15. * 载入状态并恢复
  16. */
  17. public void onRestoreInstanceState(Bundle savedInstanceState) {
  18. final Bundle dialogHierarchyState = savedInstanceState.getBundle(DIALOG_HIERARCHY_TAG);
  19. if (dialogHierarchyState == null) {
  20. // dialog has never been shown, or onCreated, nothing to restore.
  21. return;
  22. }
  23. dispatchOnCreate(savedInstanceState);
  24. mWindow.restoreHierarchyState(dialogHierarchyState);
  25. if (savedInstanceState.getBoolean(DIALOG_SHOWING_TAG)) {
  26. show();
  27. }
  28. }

9.Dialog事件监听

  该部分省略,主要定义了返回事件。按键事件和触摸事件以及长按菜单和焦点变化事件等,能够在源代码中查看具体。

  Dialog 和DialogFragment源代码

2.2 DialogFragment

  android 3.0之后引入Fragment,并推荐DialogFragment代替Dialog,一方面更好的碎片化布局能够内签到基本界面,还有一方面更能有效地在屏幕方向切换时保存状态和恢复。

  DialogFragment继承自Fragment并实现了DialogInterface的OnCancelListener和OnDismissListener 两个接口。

其基本样式有:

  • public static final int STYLE_NORMAL = 0;
  • public static final int STYLE_NO_TITLE = 1;
  • public static final int STYLE_NO_FRAME = 2;
  • public static final int STYLE_NO_INPUT = 3;

1.DialogFragment全局变量

  1. 加上前面的几种样式和静态常量Tag。其全局变量也非常easy醒目
  1. private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState";
  2. private static final String SAVED_STYLE = "android:style";
  3. private static final String SAVED_THEME = "android:theme";
  4. private static final String SAVED_CANCELABLE = "android:cancelable";
  5. private static final String SAVED_SHOWS_DIALOG = "android:showsDialog";
  6. private static final String SAVED_BACK_STACK_ID = "android:backStackId";
  7. int mStyle = STYLE_NORMAL;//默认样式
  8. int mTheme = 0;
  9. boolean mCancelable = true;
  10. boolean mShowsDialog = true;
  11. int mBackStackId = -1;//回退栈id
  12. Dialog mDialog;
  13. boolean mViewDestroyed;
  14. boolean mDismissed;
  15. boolean mShownByMe;

2.DialogFragment继承和重写Fragment

  看下在DialogFragment中重写的Fragment方法

  1. //空的构造方法
  2. public DialogFragment() {
  3. }
  4. //关联绑定activity
  5. @Override
  6. public void onAttach(Activity activity) {
  7. super.onAttach(activity);
  8. if (!mShownByMe) {
  9. // 假设不是通过我们的API创建,则该布局将不再被消失(比如作为activity界面碎片的一部分,而不是作为对话框)
  10. mDismissed = false;
  11. }
  12. }
  13. //解除绑定
  14. @Override
  15. public void onDetach() {
  16. super.onDetach();
  17. if (!mShownByMe && !mDismissed) {
  18. // 同上。在家畜绑定的时候才消失
  19. mDismissed = true;
  20. }
  21. }
  22. //fragment创建
  23. @Override
  24. public void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. mShowsDialog = mContainerId == 0;
  27. //状态恢复重建
  28. if (savedInstanceState != null) {
  29. mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL);
  30. mTheme = savedInstanceState.getInt(SAVED_THEME, 0);
  31. mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true);
  32. mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
  33. mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1);
  34. }
  35. }
  36. //依据主题风格来返回布局载入器LayoutInflater
  37. @Override
  38. public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
  39. if (!mShowsDialog) {
  40. return super.getLayoutInflater(savedInstanceState);
  41. }
  42. mDialog = onCreateDialog(savedInstanceState);
  43. switch (mStyle) {
  44. case STYLE_NO_INPUT:
  45. mDialog.getWindow().addFlags(
  46. WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
  47. WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
  48. // fall through...
  49. case STYLE_NO_FRAME:
  50. case STYLE_NO_TITLE:
  51. mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  52. }
  53. if (mDialog != null) {
  54. return (LayoutInflater) mDialog.getContext().getSystemService(
  55. Context.LAYOUT_INFLATER_SERVICE);
  56. }
  57. return (LayoutInflater) mActivity.getSystemService(
  58. Context.LAYOUT_INFLATER_SERVICE);
  59. }
  60. //当Activity创建时设置绑定Dialog的对应事件
  61. @Override
  62. public void onActivityCreated(Bundle savedInstanceState) {
  63. super.onActivityCreated(savedInstanceState);
  64. if (!mShowsDialog) {
  65. return;
  66. }
  67. View view = getView();
  68. if (view != null) {
  69. if (view.getParent() != null) {
  70. throw new IllegalStateException("DialogFragment can not be attached to a container view");
  71. }
  72. mDialog.setContentView(view);
  73. }
  74. mDialog.setOwnerActivity(getActivity());
  75. mDialog.setCancelable(mCancelable);
  76. mDialog.setOnCancelListener(this);
  77. mDialog.setOnDismissListener(this);
  78. if (savedInstanceState != null) {
  79. Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
  80. if (dialogState != null) {
  81. mDialog.onRestoreInstanceState(dialogState);
  82. }
  83. }
  84. }
  85. @Override
  86. public void onStart() {
  87. super.onStart();
  88. if (mDialog != null) {
  89. mViewDestroyed = false;
  90. mDialog.show();
  91. }
  92. }
  93. @Override
  94. public void onStop() {
  95. super.onStop();
  96. if (mDialog != null) {
  97. mDialog.hide();
  98. }
  99. }
  100. //移除Fragment的时候同一时候移除和置空dialog
  101. @Override
  102. public void onDestroyView() {
  103. super.onDestroyView();
  104. if (mDialog != null) {
  105. mViewDestroyed = true;
  106. mDialog.dismiss();
  107. mDialog = null;
  108. }
  109. }

3.DialogFragment的onCreateDialog()

  该方法负责创建我们的创建Dialog,返回一个Dialog实例

  1. public Dialog onCreateDialog(Bundle savedInstanceState) {
  2. return new Dialog(getActivity(), getTheme());
  3. }

3.DialogFragment的show()

  1. 通过获取FragmentFragmentTransaction 载入并显示当前布局。
  1. public void show(FragmentManager manager, String tag) {
  2. mDismissed = false;
  3. mShownByMe = true;
  4. FragmentTransaction ft = manager.beginTransaction();
  5. ft.add(this, tag);
  6. ft.commit();
  7. }
  8. public int show(FragmentTransaction transaction, String tag) {
  9. mDismissed = false;
  10. mShownByMe = true;
  11. transaction.add(this, tag);
  12. mViewDestroyed = false;
  13. mBackStackId = transaction.commit();
  14. return mBackStackId;
  15. }

4.DialogFragment的dismiss()

  假设回退栈不为空,则返回前一个栈页面,否则直接移除掉当前页。allowStateLoss參数表示是否同意提交的时候丢失保存的状态,false则状态未保存会抛异常。

  1. public void dismiss() {
  2. dismissInternal(false);
  3. }
  4. public void dismissAllowingStateLoss() {
  5. dismissInternal(true);
  6. }
  7. void dismissInternal(boolean allowStateLoss) {
  8. if (mDismissed) {
  9. return;
  10. }
  11. mDismissed = true;
  12. mShownByMe = false;
  13. if (mDialog != null) {
  14. mDialog.dismiss();
  15. mDialog = null;
  16. }
  17. mViewDestroyed = true;
  18. if (mBackStackId >= 0) {
  19. getFragmentManager().popBackStack(mBackStackId,
  20. FragmentManager.POP_BACK_STACK_INCLUSIVE);
  21. mBackStackId = -1;
  22. } else {
  23. FragmentTransaction ft = getFragmentManager().beginTransaction();
  24. ft.remove(this);
  25. if (allowStateLoss) {
  26. ft.commitAllowingStateLoss();
  27. } else {
  28. ft.commit();
  29. }
  30. }
  31. }

5.DialogFragment的其它方法

  DialogFragment还定义了获取当前Dialog,设置style和取得是否显示的状态等方法,这里省略。不做赘述。具体查看源代码。

  Dialog 和DialogFragment源代码

  

3.综述

  这两个雷相对照较简单和易于理解。重在实现view的加入。显示、隐藏和移除。

补充: Dialog的Builder模式

  在AlertDialog的实现中。有使用到Builder这么一个静态类。事实上实用的设计模式中的Builder模式。

关于建造者模式(Builder Pattern)。也叫生成器模式。它能将一个复杂对象的构建与它的表示分离开。同一时候使相同的构建过程能够创建不同的表示。

 从AlertDialog简单解释来讲,就是我们不用关心这个dialog是怎样创建,怎么实现,仅仅用简单的通过builder来设计我们想要的结果,他的每一个set方法都返回其对象本身,我们仅仅需将想要的效果和属性附加到这个对象上去就好了。想深入了解的同学。能够自行谷歌/百度 Java设计模式–建造者模式(Builder Pattern).

  

  下一篇。我们将通过自己定义来实现IOS一个常见的ActionSheet样式。demo结合自己定义View,到使用builder模式,重写DialogFragment来讲,具体效果前一篇已经展示了,内容详情请关注接下来的新博文。


版权声明:本文博主原创文章。博客,未经同意不得转载。

Dialog与FragmentDialog源代码分析的更多相关文章

  1. ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  2. ffdshow 源代码分析 9: 编解码器有关类的总结

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  3. ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  4. ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  5. ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  6. ffdshow 源代码分析 5: 位图覆盖滤镜(总结)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  7. ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  8. ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  9. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

随机推荐

  1. [Leetcode][Python]51: N-Queens

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 51: N-Queenshttps://oj.leetcode.com/pro ...

  2. relay 2015-02-05 21:00 27人阅读 评论(0) 收藏

    scanf函数是以在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔. C编译在碰到空格,TAB,回车或非法数据(如对"%d"输 ...

  3. hdu 4711 Weather概率dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4711 真的是坑吐血了,wa了5次  最后实在无语 把long long double 改成long double ...

  4. 消息内容定义XML

    <XML>     <Title>title</Title>     <ContentType>text/plain</ContentType&g ...

  5. 甲骨文推动Java进军“物联网”

    该公司希望在嵌入式设备开发项目上Java可以取代C     随着周二宣布对嵌入式的Java版本进行升级,甲骨文希望扩展该平台到新一代连接设备,又名物联网.甲骨文还希望,Java可以在一些嵌入式开发项目 ...

  6. hdu1079 Calendar Game

    Calendar Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  7. 在SQL Server中如何快速查找DBCC命令和语法?

    DBCC命令非常好用,但是命令很多语法就很多,如何快速记忆呢?是否都要背下来.其实不用,只要能知道每个命令的作用并且记住DBCC HELP命令就可以了. --查找所有的DBCC命令 DBCC  HEL ...

  8. multiset集合容器的集合运算:并、交、差

    set和multiset的内部通常是采用平衡二叉树来实现.当放入元素时,会按照一定的排序方法自动排序,默认是按照less<>排序规则来排序.这种自动排序的特性加速了元素查找的过程,但问题是 ...

  9. UVA 10131 Is Bigger Smarter?(DP)

    Some people think that the bigger an elephant is, the smarter it is. To disprove this, you want to t ...

  10. 如何实现在O(n)时间内排序,并且空间复杂度为O(1)

    对于常见的排序算法,很难做到在O(n)时间内排序,并且空间复杂度为O(1),这里提供了一种方法可以达到要求. 可以使用哈希排序的思想,也就是将所有的数哈希到哈希表中,实现排序.具体的算法思想是,求出这 ...