`
dingran
  • 浏览: 374847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个关于Dialog内的UI线程的使用问题

阅读更多

在Dialog.java类中,有几行代码是关乎UI线程的操作的,拿出来研究一下,呵呵

 

private final Thread mUiThread ;

private final Handler mHandler = new Handler();// 只在下面用了一次而已

private final Runnable mDismissAction = new Runnable() {
        public void run() {
            dismissDialog();
        }
    };

 

/**
 * Dismiss this dialog, removing it from the screen. This method can be
 * invoked safely from any thread.  Note that you should not override this
 * method to do cleanup when the dialog is dismissed, instead implement
 * that in {@link #onStop}.
 */

public void dismiss() {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(mDismissAction);
        } else {
            mDismissAction.run();
        }

    }

 

/**
     * Create a Dialog window that uses a custom dialog style.
     *
     * @param context The Context in which the Dialog should run. In particular, it
     *                uses the window manager and theme from this context to
     *                present its UI.
     * @param theme A style resource describing the theme to use for the
     * window. See <a href="{@docRoot}guide/topics/resources/available-resources.html#stylesandthemes">Style
     * and Theme Resources</a> for more information about defining and using
     * styles.  This theme is applied on top of the current theme in
     * <var>context</var>.  If 0, the default dialog theme will be used.
     */
    public Dialog(Context context, int theme) {
        mContext = new ContextThemeWrapper(
            context, theme == 0 ? com.android.internal.R.style.Theme_Dialog : theme);
        mWindowManager = (WindowManager)context.getSystemService("window");
        Window w = PolicyManager.makeNewWindow(mContext);
        mWindow = w;
        w.setCallback(this);
        w.setWindowManager(mWindowManager, null, null);
        w.setGravity(Gravity.CENTER);
        mUiThread = Thread.currentThread();
        mListenersHandler = new ListenersHandler(this);
    }

 

我猜想,这个像对话框这种控件是只允许在UI主线程内操作的,也就是说只能由UI主线程来控制显示或消失等等,

那么有些对话框不依赖于Activity也就不容易找到UI主线程,所以就得需要把它的新线程的操作并入UI主线程中去完成,

也就是mHandler.post(mDismissAction);

 

那么主线程从哪来的呢?就在Dialog的构造里找到的,mUiThread = Thread.currentThread();

这依赖于制造这个Dialog的地方的性质。

 

只是我的猜想,如果有人觉得可以再分析一下,欢迎讨论,敬请指教,谢啦

分享到:
评论

相关推荐

    Android-dialog库可以在任意类内调用子线程或ui线程内均可显示

    标题提到的“Android-dialog库”是Android开发中的一个第三方库,它提供了一种灵活的方式,使得开发者能够在任意类中方便地调用Dialog,并且支持在子线程或UI线程内显示,这极大地提高了代码的可复用性和执行效率。...

    MFC创建UI线程

    MFC创建UI线程是应用程序设计中的一个重要环节,尤其对于那些需要处理用户界面更新和响应用户交互的复杂应用。线程允许应用程序同时执行多个任务,提高性能和用户体验。下面我们将深入探讨如何在MFC中创建UI线程以及...

    VC++基于dialog的简单的线程使用

    - `AfxBeginThread`:这是MFC提供的一个封装函数,更方便地创建线程,它会自动处理消息循环,适合用于UI线程。 2. **线程函数**: 在VC++中,每个线程都有自己的执行入口,即线程函数。线程函数通常是一个`WinAPI...

    Windows风格Dialog 与 多线程断点下载demo

    另一个是多线程断点下载的实现,可能包含了下载管理器类、下载线程类以及相关的进度更新和错误处理逻辑。通过阅读和分析这两个demo,开发者可以深入理解这两种技术,并将其应用到自己的项目中,提升应用的功能性和...

    安卓Service中弹Dialog

    然而,有时我们需要在Service中显示一个`Dialog`来与用户进行交互,例如提示信息或获取用户确认。这涉及到Android系统服务的生命周期管理以及如何在非UI线程中正确地操作UI元素。 首先,理解`Service`的生命周期是...

    android 微信 全手机图片选择器 dialog 多线程 快速

    在Android开发中,微信风格的全手机图片选择器是一个常见的需求,主要用于用户在应用内选择多张图片。本文将深入探讨如何实现这样一个功能,重点在于`dialog`形式、多线程优化以及对不同Android版本的兼容性。 首先...

    C#多线程之如何弹出一个模式窗口来显示进度条

    接下来,我们关注如何在UI线程之外启动一个新的线程来执行长任务。这可以通过创建`Thread`对象并调用其`Start()`方法实现。然而,更新UI元素,如显示进度条,必须在UI线程中完成,因为只有主线程有权修改控件状态。...

    基于QT的多线程定时器

    在`mythread.cpp`和`mythread.h`文件中,可能会定义一个继承自`QThread`的类,实现线程内的工作逻辑。 2. **多线程** 多线程技术允许程序同时执行多个任务,提升效率。在基于QT的多线程定时器中,可能有一个或多个...

    基于VS2010的C++多线程开发Demo

    本文将深入探讨如何使用VS2010进行C++多线程开发,通过一个具体的Demo来阐述相关概念和技术。 首先,我们要明白C++中的多线程。在单线程程序中,所有任务都在同一个执行流中完成,而多线程则允许程序同时执行多个...

    Dialog加载Demo

    "Dialog加载Demo"通常是指一个示例项目,它演示了如何在Android应用中实现Dialog来显示数据加载的过程。这样的Demo对于开发者来说非常有价值,因为它提供了直观的实例,帮助他们理解和学习如何优雅地处理异步任务和...

    通用的Dialog工具类

    9. **易于使用**:提供简洁的API,使开发者能快速创建和管理Dialog,例如一个简单的`show()`方法来显示Dialog,`dismiss()`方法来关闭Dialog。 在`MyApplication`这个项目中,我们可以根据上述功能点来设计和实现...

    Android高级应用源码-自定义列表选择Dialog,适用网络请求数据.zip

    这个“Android高级应用源码-自定义列表选择Dialog,适用网络请求数据.zip”文件提供了一个实例,展示了如何创建一个可以加载网络数据并展示在列表中的自定义Dialog。下面将详细阐述相关知识点: 1. **自定义Dialog*...

    AWT与线程

    如果在非EDT线程中修改UI组件,可能会导致线程安全问题和UI不一致。 下面将详细介绍这两个主题: 1. AWT组件: - AWT组件包括基本控件,如Button、Label、TextField、TextArea等,以及更复杂的组件如Window...

    线程中控制窗口内容

    而`ThreadControlUi`可能是一个源代码目录,包含具体的实现文件,如`.cpp`和`.h`,这些文件会详细展示如何创建和管理线程,以及如何在不同线程间安全地通信和操作UI。 为了在工作线程中控制窗口内容,开发者需要...

    Android Studio Service安卓在服务中如何弹出Dialog

    然而,有时我们需要在服务中弹出一个Dialog来通知用户或获取用户输入。`Android Studio`作为官方推荐的集成开发环境,提供了一系列工具来支持这种需求。本文将详细介绍如何在`Service`中实现弹出Dialog的功能。 ...

    dialog基本全了

    标题中的“dialog基本全了”表明这是一个关于对话框(Dialog)的综合资源,可能是包含了一系列与对话框相关的代码示例、教程或者API解释。描述中的“好东西不要错过了,自己写的”暗示这是一份个人整理的高质量资料...

    多线程在对话框中的创建

    - 使用`AfxBeginThread`:该函数接受一个线程函数指针和参数,返回新线程的`CWinThread*`指针。例如: ```cpp CWinThread* pThread = AfxBeginThread(RUNTIME_CLASS(CMyThreadClass), NULL); ``` - 在这里,`...

    android透明的自定义Dialog和Toast在SurfaceView中的展示源码

    2. **绘制线程**:由于SurfaceView有自己的绘图线程,我们需要创建一个新的线程来处理绘图操作,确保不阻塞主线程。 3. **同步问题**:在SurfaceView上进行绘制时,需要注意`SurfaceHolder`的锁`canvas.lockCanvas...

    MFC基于对话框的多线程测试

    需要注意的是,由于MFC的UI更新通常在一个特定的消息循环中完成,所以从其他线程修改UI是不安全的。如果需要从多线程中更新UI,可以使用`PostMessage`或`SendDlgItemMessage`函数将消息发送到主线程,由主线程来处理...

    双listviewDialog

    在实际开发中,可能还需要考虑性能优化,例如使用ViewHolder模式减少视图复用的开销,以及在数据加载时使用异步加载机制,避免阻塞UI线程。 总结起来,"双listviewDialog"是一个通过联动两个ListView实现交互功能的...

Global site tag (gtag.js) - Google Analytics