在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库”是Android开发中的一个第三方库,它提供了一种灵活的方式,使得开发者能够在任意类中方便地调用Dialog,并且支持在子线程或UI线程内显示,这极大地提高了代码的可复用性和执行效率。...
MFC创建UI线程是应用程序设计中的一个重要环节,尤其对于那些需要处理用户界面更新和响应用户交互的复杂应用。线程允许应用程序同时执行多个任务,提高性能和用户体验。下面我们将深入探讨如何在MFC中创建UI线程以及...
- `AfxBeginThread`:这是MFC提供的一个封装函数,更方便地创建线程,它会自动处理消息循环,适合用于UI线程。 2. **线程函数**: 在VC++中,每个线程都有自己的执行入口,即线程函数。线程函数通常是一个`WinAPI...
另一个是多线程断点下载的实现,可能包含了下载管理器类、下载线程类以及相关的进度更新和错误处理逻辑。通过阅读和分析这两个demo,开发者可以深入理解这两种技术,并将其应用到自己的项目中,提升应用的功能性和...
然而,有时我们需要在Service中显示一个`Dialog`来与用户进行交互,例如提示信息或获取用户确认。这涉及到Android系统服务的生命周期管理以及如何在非UI线程中正确地操作UI元素。 首先,理解`Service`的生命周期是...
正确做法是将这些耗时任务放在一个单独的工作线程中执行,主线程则继续处理UI事件。 **3. 创建和使用工作线程** 在MFC中,可以继承CWinThread类并重写其成员函数,创建自定义的工作线程类。通常需要重写以下几个...
接下来,我们关注如何在UI线程之外启动一个新的线程来执行长任务。这可以通过创建`Thread`对象并调用其`Start()`方法实现。然而,更新UI元素,如显示进度条,必须在UI线程中完成,因为只有主线程有权修改控件状态。...
本文将深入探讨如何使用VS2010进行C++多线程开发,通过一个具体的Demo来阐述相关概念和技术。 首先,我们要明白C++中的多线程。在单线程程序中,所有任务都在同一个执行流中完成,而多线程则允许程序同时执行多个...
在Android开发中,微信风格的全手机图片选择器是一个常见的需求,主要用于用户在应用内选择多张图片。本文将深入探讨如何实现这样一个功能,重点在于`dialog`形式、多线程优化以及对不同Android版本的兼容性。 首先...
在`mythread.cpp`和`mythread.h`文件中,可能会定义一个继承自`QThread`的类,实现线程内的工作逻辑。 2. **多线程** 多线程技术允许程序同时执行多个任务,提升效率。在基于QT的多线程定时器中,可能有一个或多个...
"Dialog加载Demo"通常是指一个示例项目,它演示了如何在Android应用中实现Dialog来显示数据加载的过程。这样的Demo对于开发者来说非常有价值,因为它提供了直观的实例,帮助他们理解和学习如何优雅地处理异步任务和...
9. **易于使用**:提供简洁的API,使开发者能快速创建和管理Dialog,例如一个简单的`show()`方法来显示Dialog,`dismiss()`方法来关闭Dialog。 在`MyApplication`这个项目中,我们可以根据上述功能点来设计和实现...
这个“Android高级应用源码-自定义列表选择Dialog,适用网络请求数据.zip”文件提供了一个实例,展示了如何创建一个可以加载网络数据并展示在列表中的自定义Dialog。下面将详细阐述相关知识点: 1. **自定义Dialog*...
如果在非EDT线程中修改UI组件,可能会导致线程安全问题和UI不一致。 下面将详细介绍这两个主题: 1. AWT组件: - AWT组件包括基本控件,如Button、Label、TextField、TextArea等,以及更复杂的组件如Window...
而`ThreadControlUi`可能是一个源代码目录,包含具体的实现文件,如`.cpp`和`.h`,这些文件会详细展示如何创建和管理线程,以及如何在不同线程间安全地通信和操作UI。 为了在工作线程中控制窗口内容,开发者需要...
然而,有时我们需要在服务中弹出一个Dialog来通知用户或获取用户输入。`Android Studio`作为官方推荐的集成开发环境,提供了一系列工具来支持这种需求。本文将详细介绍如何在`Service`中实现弹出Dialog的功能。 ...
标题中的“dialog基本全了”表明这是一个关于对话框(Dialog)的综合资源,可能是包含了一系列与对话框相关的代码示例、教程或者API解释。描述中的“好东西不要错过了,自己写的”暗示这是一份个人整理的高质量资料...
- 使用`AfxBeginThread`:该函数接受一个线程函数指针和参数,返回新线程的`CWinThread*`指针。例如: ```cpp CWinThread* pThread = AfxBeginThread(RUNTIME_CLASS(CMyThreadClass), NULL); ``` - 在这里,`...
2. **绘制线程**:由于SurfaceView有自己的绘图线程,我们需要创建一个新的线程来处理绘图操作,确保不阻塞主线程。 3. **同步问题**:在SurfaceView上进行绘制时,需要注意`SurfaceHolder`的锁`canvas.lockCanvas...
需要注意的是,由于MFC的UI更新通常在一个特定的消息循环中完成,所以从其他线程修改UI是不安全的。如果需要从多线程中更新UI,可以使用`PostMessage`或`SendDlgItemMessage`函数将消息发送到主线程,由主线程来处理...