Android Non-UI to UI Thread Communications(Part 2 of 5)
Original:http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-2-of-5/
his is the second part of my series of blog posts on Android non-UI thread-to-UI thread communications. See herefor the start of the series. As a refresher, this series of posts is about how non-UI threads can communicate back to the UI thread in an Android application in order to update the user interface. Non-UI threads are not allowed to make updates to the UI. Trying to do too much work (as defined as not allowing the user to interact with the UI for more than 5 seconds) on the UI thread leads to ANR errors.
THE SIMPLE APP – REVIEW
In my last post, I provided a simple app (called Simple App) that provided two buttons to start/stop a non-UI thread. The non-UI thread’s job is to simulate long running work was by generating a random number, call the UI to have a TextView widget update the display of the random number, and then sleep for a number of seconds.

In the first of this five part series, I showed you how to use an Activity’s runOnUiThread() method in a non-UI thread to post requests to change the user interface via the UI thread’s event message queue. In this blog, option #2 is explained – using the post() method of an Android View component to request changes to the UI.
The SimpleApp example code for demonstrating option #2 can be found here(in an Eclipse project ZIP file).
OPTION 2 – USING VIEW’S POST() METHOD
When a non-UI thread has access to a Viewcomponent from the user interface, the non-UI thread can make a call to that View component’s post() method to request a UI change.
Just like when calling on runOnUiThread() of an Activity, calling on the View’s post() communicates the desire to request work be run on the UI thread by publishing a message in the event queue of the UI thread. When it can, the UI thread picks up the action message in the event queue and performs the UI change. So the post() method is a convenience (just as runOnUiThread is) for completing this messaging operation.
Here is the non-UI thread class – DoSomethingThread from the SimpleApp – that generates a random number and then calls on its publishProgress() method to get the random number displayed on the UI using post().
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public class DoSomethingThread extends Thread {
private static final String TAG = "DoSomethingThread";
private static final int DELAY = 5000; // 5 seconds
private static final int RANDOM_MULTIPLIER = 10;
@Override
public void run() {
Log.v(TAG, "doing work in Random Number Thread");
while (true) {
int randNum = (int) (Math.random() * RANDOM_MULTIPLIER);
publishProgress(randNum);
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
Log.v(TAG, "Interrupting and stopping the Random Number Thread");
return;
}
}
}
private void publishProgress(int randNum) {
Log.v(TAG, "reporting back from the Random Number Thread");
final String text = String.format(getString(R.string.service_msg), randNum);
mainFrag.resultsTextView.post(new Runnable() {
@Override
public void run() {
mainFrag.getResultsTextView().setText(text);
}
});
}
}
|
Note in line 3 of the publishProgress() method above in the one line of code that changes between Option 1 (using runOnUiThread) and Option 2 here (using post).
CONSIDERATIONS OF OPTION 2 – POST() METHOD
As indicated, the post() method is using the same event message queue under the covers as runOnUiThread(). So in some regards, many of the pro/cons of post() are that of runOnUiThread(). A StackOverflow post (here) provides some detailed insight.
Essentially, in order to use post(), your non-UI thread must have awareness of a View component (from the UI). This allows the non-UI thread to avoid direct connection to the Activity (which was required with runOnUiThread). There are times when your non-UI thread may know a View and not an Activity or vice versa. However, both options might more tightly couple the non-UI thread to the UI side given View components and Activities are UI “stuff.”
Also as with the runOnUiThread() option, this post() method option requires you to create and manage your threads more directly – and thereby have more control of the thread and its communication but also require you to have more experience with Java concurrency/thread APIs and issues.
Unlike the runOnUiThread() method, the post() method does not check whether the current thread is the UI thread. Therefore the post() method does not cause the Runnable to execute immediately if it is on the UI thread. Instead, post() always has an event message pushed to the message queue for reaction by the UI thread.
WRAP UP
Stay tuned to this blog site for the next 3 options regarding the Android thread communications. Again, if you need help on your mobile project or need some mobile training (Android, iOS, other) let Intertech help. Please contact us.
Read more: http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-2-of-5/#ixzz3MyttDTTp
Follow us: @IntertechInc on Twitter | Intertech on Facebook
Android Non-UI to UI Thread Communications(Part 2 of 5)的更多相关文章
- Android Non-UI to UI Thread Communications(Part 3 of 5)
Original:http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-3-of-5/ Conti ...
- Android子线程更新UI成功
android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...
- Android Phonebook编写联系人UI加载及联系人保存流程(一)
2014-01-06 17:05:11 将百度空间里的东西移过来. 本文适合ROM定制做Phonebook的童鞋看,其他人飘过即可- Phonebook添加/编辑联系人UI加载及保存联系人流程,是一系 ...
- 50个Android开发人员必备UI效果源码[转载]
50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...
- 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1
************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...
- 重大发现: windows下C++ UI库 UI神器-SOUI(转载)
转载:http://www.cnblogs.com/setoutsoft/p/4996870.html 在Windows平台上开发客户端产品是一个非常痛苦的过程,特别是还要用C++的时候.尽管很多语言 ...
- 转: windows下C++ UI库 UI神器-SOUI
转:http://www.cnblogs.com/setoutsoft/p/4996870.html 前言 在Windows平台上开发客户端产品是一个非常痛苦的过程,特别是还要用C++的时候.尽管很多 ...
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(六)Picker View视图 学习笔记
想对PickerView进行操作,只能在代码中操作. 下面 ,再添加三个label组件,然后将所有组件配置到代码中(看代码),然后要实现对PickerView的操作,就要实现它的DataSource协 ...
- 【译】UI设计基础(UI Design Basics)--导航(Navigation)(六)
[译]UI设计基础(UI Design Basics)--导航(Navigation)(六)
随机推荐
- VS模板文件修改,自动生成注释
VS的模板文件存放在IDE下的ItemTemplatesCache文件夹下 1.不同VS版本IDE文件夹路径个有不同,下面以VS2012为例,IDE文件夹路径如图:
- KafkaOffsetMonitor使用方法
(1)下载jar包 去网上搜索KafkaOffsetMonitor即可. 我这里共享了我的百度云连接:http://yun.baidu.com/s/1nvGjbDn 如果某一天我这个取消共享了,大家去 ...
- [转]insmod
[转]insmod http://www.cnblogs.com/amaoxiaozhu/archive/2013/03/08/2950002.html 在Linux下,驱动程序是内核的一部分,运行在 ...
- [转]Cygwin的包管理器:apt-cyg
[转]Cygwin的包管理器:apt-cyg http://zengrong.net/post/1792.htm Cygwin的包管理工具setup.exe实在是难用的让人蛋碎.于是就有了这样一个ap ...
- Linq To SQLite by CRUD
1, 希望使用linqtoSQLite 来对数据库实现CRUD, 开发环境 VS2013, 1.1 在网上找到了 LINQ to DB T4 Models, 配置参考网址链接: http://www. ...
- homework-02 二维的,好喝的(二维数组的各种子数组)
1)输入部分 对于输入部分,我定义的输入格式是这样的 前两行为列数和行数 如果文件无法打开,或者输入文件格式不对,均会提示出错并退出 2)二维数组的最大矩形子数组 首先,我使用最最简单的暴力算法,直接 ...
- Log4Net学习【三】
Log4Net配置详解 配置方式一 在相应的应用程序的配置文件中配置,(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例是Web应用程序,以Web.co ...
- linux下搭建mysql主从
在master上创建repl账户,用于复制. grant replication slave on *.* to 'repl'@'%' identified by 'P@$$W0rd'; flush ...
- 文档对象模型(DOM)
文档对象模型(DOM) DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构.节点分为几种不同的类型:文档型节点.元素节点.特性节点.注释节点等共有12种节点类型.DOM1级定义了 ...
- 【转】eclipse技巧2
谈谈eclipse使用技巧二 上节说道了怎么使用eclipse使您事半功倍.这节告诉您怎么用eclipse练成火眼金睛. ①借你一双火眼金睛让类的层次结构一目了然让你阅读代码如虎添翼 一个好的类的层次 ...