`
dingran
  • 浏览: 372400 次
  • 性别: 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线程内均可显示

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

    python之线程通过信号pyqtSignal刷新ui的方法

    ui文件(可拉动控件自行创建一个button和text) &lt;?xml version=1.0 encoding=UTF-8?&gt; &lt;ui version=4.0&gt; &lt;class&gt;Dialog &lt;widget class=QDialog name=Dialog&gt; &lt;x&gt;0 &lt;y&gt;0 &lt;width&gt;585 &lt;height&gt;394 ...

    PYQT5开启多个线程和窗口,多线程与多窗口的交互实例

    每点击一次按钮,弹出一个对话框(子窗口),同时开启一个子线程来执行任务并更新对话框内容,关闭对话框则关闭对应子线程 1. 建立一个简单的主界面和一个自定义对话框 from PyQt5 import QtCore, QtGui, QtWidgets ...

    Android高级编程.pdf

    7.2.2 创建一个应用程序来管理Test Location Provider 7.3 选择——个Location Provider 7.3.1 查找可用的提供器 7.3.2 根据要求标准查找提供器 7.4 确定自己所在的位置 7.4.1 “Where Am I”示例 7.4.2 追踪移动 ...

    《Android高级编程》

    5.3 使用Internet资源 5.3.1 连接到Internet资源 5.3.2 利用Internet资源 5.4 Dialog简介 5.4.1 Dialog类简介 5.4.2 使用活动作为对话框 5.5 创建一个地震查看器 5.6 小结 第6章 数据存储、检索和共享 6.1 Android中...

    深入浅出MFC【侯捷】

    正确态度 MFC多线程程序设计 探索CWinThread 产生一个Worker Thread 产生一个UI Thread 线程的结束 线程与同步控制 MFC多线程程序例程 第15章 定制一个AppWizard 到底Wizard是什么? Custom AppWizard的基本操作 ...

    深入浅出MFC 2e

    一个线程的诞生与死亡 以_beginthreadex取代CreateThread 线程优先级(Priority) 多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 ...

    侯捷- -深入浅出MFC

    一个线程的诞生与死亡 以_beginthreadex取代CreateThread 线程优先级(Priority) 多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 ...

    扫描仪/WIA 设备管理器对象/数码设备操作-易语言

    这不是一个完成品,差不多只是个半成品。 源码只有对平板扫描仪的一些操作,没有其他数码产品的操作。 可以定义扫描时,是否显示扫描进度 (原本想实现局域网网络扫描, 但无法在线程中扫描,在扫描时 客户端发来...

    Android加载对话框同时异步执行实现方法

    Android中通过子线程连接网络获取资料,同时显示加载进度对话框给用户的操作,需要Thread和Handler来完成,在Thread中执行比较耗时的代码,完成后再通过Handler发送消息给主线程,由主线程刷新UI。 在实现上比较的...

    Visual C++ 编程资源大全(英文源码 表单)

    45.zip Sizable dialogs at its easiest 轻松改变对话框的大小(5KB)&lt;END&gt;&lt;br&gt;46,46.zip A Snap Size Dialog Class 一个捕获对话框大小的类(5KB)&lt;END&gt;&lt;br&gt;47,47.zip CSplitterWnd in a Dialog based ...

    Android高级编程--源代码

    由于现有的手机应用程序的开发是构建在各手机厂家的私有操作系统之上的,所以它限制了第三方应用程序的开发,而Android为我们提供了一个开放和通用的选择。因为没有了人为制造的障碍,所以Android开发人员可以自由地...

    DialogX::speech_balloon:DialogX内置组件库,更方便易用,可自定义程度更高,扩展性更强,轻松实现各种方式,菜单和提示效果,可以使用iOS,MIUI等主题扩展可选

    经过三代的更迭,全新的Kongzue DialogX已经到来,不仅仅保留了以前的优势,更带来... DialogX的启动与线程无关,你可以在任意线程启动DialogX而它都将自动在UI线程运行。 DialogX的启动不需要上下文参数,交替提供静态

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

    【Android】CalledFromWrongThreadException 深入源码分析

    出现此问题的原因是:在非 UI 线程中创建了 Dialog,而在 UI 线程中调用了 show() 方法 问题还原 在使用 dialog 的时候,因为线程问题,在调用 dismiss() 方法的时候,出现如下常见的 crash–Only the original ...

    Android 开发技巧

    开辟一个线程: 167 THREAD: 168 HANDER 170 TIMER 173 ANDROID 界面刷新 174 MESSAGE HANDER 175 用法: 175 线程与子线程调用MessageHander 177 Messagehandler实例 177 8、数据存储与读取 179 1. PREFERENCES ...

    Android开发资料合集-World版!

    开辟一个线程: 167 THREAD: 168 HANDER 170 TIMER 173 ANDROID 界面刷新 174 MESSAGE HANDER 175 用法: 175 线程与子线程调用MessageHander 177 Messagehandler实例 177 8、数据存储与读取 179 1. PREFERENCES ...

    Android应用源码安卓源码(172个合集).zip

    OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar Phonegap+HTML5+CSS3+jQuer简单界面模板示例及源码.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单DEMO.zip QQ的登录界面 源...

    易语言-易语言扫描仪/WIA 设备管理器对象/数码设备操作

    这不是一个完成品,差不多只是个半成品。 源码只有对平板扫描仪的一些操作,没有其他数码产品的操作。 可以定义扫描时,是否显示扫描进度 (原本想实现局域网网络扫描,但无法在线程中扫描,在扫描时客户端发来请求...

    Android常用对话框使用大全

    1.当弹出对话框是会结束UI线程(即主线程); 2.当前的Activity会失去焦点; 3.消息对话框、确认对话框、列表对话框、单选和多选对话框、自定义对话框 二、对话框的组成(一般有四部分组成) 1.图标 2.标题 3.内容 4...

Global site tag (gtag.js) - Google Analytics