In parts 1-3 of this series, I have explored three different means for an Android non-UI thread to communicate user interface updates to the UI thread. The links below are to the series posts.

In this fourth installment, I want to show you how to use a broadcasts and a broadcast receiver to provide non-UI to UI thread communications.

BACKGROUND NON-UI THREAD TO UI THREAD COMMS

As background for those jumping into the middle of this series, non user interface (UI) threads are not allowed to make updates to the UI.  For example, using a non-UI thread to update a TextView’s displayed text results in a CalledFromWrongThreadException.  However, 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 Android Not Responsive errors.  So you need to have non-UI threads perform larger/bigger computing tasks, but need those threads to be able to communicate updates back to the UI thread to perform display updates.

In the first three posts, I showed how to use an activity’s runOnUiThread() method, a view component’s post() method, and the Android Handler Framework to have the non-UI thread send a user interface update request back to the UI thread for display.  Each of these past three options take advantage of the underlying UI event message channel to message the UI thread to perform the user interface update.  In this post, I show you a different means of providing the communications via broadcast intent that is acted on by a BroadcastReceiver on the UI thread.

SIMPLE APP

A simple application (called Simple App) will again be used to demonstrate the use of broadcast messages for thread communications.  The app has two buttons to start/stop a non-UI thread.  The non-UI thread’s job is to simulate long running work 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.

The application code for this simple example is provided here.

OPTION 4 – USING A BROADCAST

Broadcasts are Android Intents that indicate some action has occurred.  Some broadcasts are system broadcasts.  For example, one of the built in Android broadcast is that the battery is low.  You can create your own custom broadcasts as well.

Broadcast receivers are components in the application that listen for broadcasts and take some action.  You could, for example, build a broadcast receiver to listen for the battery getting low broadcast event in order to inform the user that unsaved data should be saved quickly.  Of course, you can also build a broadcast receiver to listen for your own custom application broadcasts.

So, a broadcast and broadcast receiver can be used to accomplish the non-UI to UI thread communications.  The non-UI thread can publish a broadcast intent that a broadcast receiver associated to the UI thread uses to perform the UI update.

Now, per the Android documentation on BroadcastReceivers, if your custom application broadcasts are not going to be used across applications, you should consider using a LocalBroadcastManager to send a local broadcast versus a system broadcast.  A LocalBroadcastManager’s intent broadcasts are not broadcast to other applications.  They are therefore a bit more efficient and secure than using a general broadcast message.  You can read a prior blog postof mine to learn more about LocalBroadcastManager and local broadcasts.

Therefore, given the fact that the non-UI to UI thread communication is local to your application, I would recommend (and will show below) using the LocalBroadcastManager to perform the thread communications.

PUBLISHING THE BROADCAST

First, from the non-UI thread, create an Intent that provides the necessary information to the UI thread about the user interface updates that are required.  In this example, the non-UI thread simply provides the new random number that was generated as extra data (under the key of “result”) in the Intent.  Then use an instance of Android’s LocalBroadcastManager to send the local broadcast.

 
1
2
3
Intent intent = new Intent("com.intertech.random.generation");
intent.putExtra("result", text);
LocalBroadcastManager.getInstance(ShowSomethingActivity.this).sendBroadcast(intent);
SET A BROADCAST RECEIVER LISTENING

On the UI thread, you need to create an instance of BroadcastReceiver to listen for updates coming from the non-UI thread.  In this simple application, I created an anonymous BroadcastReceiver instance from within the createBroadcastRecevier() method which is called from the onCreate( ) method of the application’s main activity.

 
1
2
3
4
5
6
7
8
private BroadcastReceiver createBroadcastReceiver() {
  return new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      updateResults(intent.getStringExtra("result"));
    }
  };
}

The updateResults() method of the broadcast receiver gets the TextView and updates the string with what is in the broadcast’s extra data at “result”.

Once the broadcast receiver is created in onCreate(), use a LocalBroadcastManager to register the UI thread for the broadcasts sent by the non-UI thread, specifically those with the string action of “com.intertech.random.generation”);

 
1
2
3
4
5
6
7
8
9
@Override
protected void onCreate(Bundle savedInstanceState) {
  ...
 
  resultReceiver = createBroadcastReceiver();
  LocalBroadcastManager.getInstance(this).registerReceiver(resultReceiver, new IntentFilter("com.intertech.random.generation"));
 
  ...
}

Now, once the non-UI thread publishes its local broadcast, the broadcast receiver listening for the message gets the Intent and takes on the responsibility of updating the UI on the UI thread.

As a last bit of housekeeping, make sure to unregister the broadcast receiver when the communication between non-UI and UI threads is no longer needed.  In this example, I unregister the BroadcastReceiver in the onDestroy() method of the main activity.

 
1
2
3
4
5
6
7
@Override
protected void onDestroy() {
  if (resultReceiver != null) {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(resultReceiver);
  }
  super.onDestroy();
}
CONSIDERATIONS OF OPTION 4 – BROADCASTS

The broadcast option is not reliant on the message event queue.  Instead it relies on a different Android set of components; namely the Intent and Intent listener called a broadcast receiver.  This sub-framework has pluses and minuses.  There are no convenience methods as provided through methods like post() and runOnUiThread() using the thread’s event queue.  Some consider working with Intents, BroadcastReceivers (and LocalBroadcastManager) a bit more complex.  However, the broadcast intent can conveniently carry quite a bit of data to the UI thread from the non-UI thread.  Also importantly, the non-UI thread and UI thread do not have to share any component knowledge.  So the non-UI thread is quite decoupled from the UI thread.  The only information shared by the two threads is the name of the intent action.

WRAP UP

Just one more post in this series.  In that post, I’ll show you how to use an AsyncTask’s for do long running work on a separate non-UI thread, while still being able to push changes to the UI via special UI thread methods.

Please connect with Intertechif you or your organization could use help on your Android/mobile project.

Read more: http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-4-of-5/#ixzz3Myuoh9Jf 
Follow us: @IntertechInc on Twitter | Intertech on Facebook

android-non-ui-to-ui-thread-communications-part-4-of-5的更多相关文章

  1. 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 ...

  2. 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 i ...

  3. Android子线程更新UI成功

    android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...

  4. Android Phonebook编写联系人UI加载及联系人保存流程(一)

    2014-01-06 17:05:11 将百度空间里的东西移过来. 本文适合ROM定制做Phonebook的童鞋看,其他人飘过即可- Phonebook添加/编辑联系人UI加载及保存联系人流程,是一系 ...

  5. 50个Android开发人员必备UI效果源码[转载]

    50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...

  6. 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1

    ************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...

  7. 重大发现: windows下C++ UI库 UI神器-SOUI(转载)

    转载:http://www.cnblogs.com/setoutsoft/p/4996870.html 在Windows平台上开发客户端产品是一个非常痛苦的过程,特别是还要用C++的时候.尽管很多语言 ...

  8. 转: windows下C++ UI库 UI神器-SOUI

    转:http://www.cnblogs.com/setoutsoft/p/4996870.html 前言 在Windows平台上开发客户端产品是一个非常痛苦的过程,特别是还要用C++的时候.尽管很多 ...

  9. 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(六)Picker View视图 学习笔记

    想对PickerView进行操作,只能在代码中操作. 下面 ,再添加三个label组件,然后将所有组件配置到代码中(看代码),然后要实现对PickerView的操作,就要实现它的DataSource协 ...

  10. 【译】UI设计基础(UI Design Basics)--导航(Navigation)(六)

    [译]UI设计基础(UI Design Basics)--导航(Navigation)(六)

随机推荐

  1. windows phone 8.1 HttpWebRequest 请求服务器

    public string SendGetRequest(string baseurl, string parameters) { string parassb = parameters; ) { b ...

  2. 开发一个App的成本是多少?

    英文出处:savvyapps.欢迎加入翻译小组. 在最近的一个会议上,一个叫Bob的老顾客引用了<App Savvy>(<放飞App:移动产品经理实战指南>)中探讨研发一个io ...

  3. maven学习手记 - 3

    学习目标 maven插件的定义: maven插件的使用.   前言 在手记2中说过maven的阶段命令是通过插件实现的.在手记1中也有简单的示范过插件的用法.但是总觉得有些泛泛了,想在这里再捋一下,以 ...

  4. matlab 函数的编写与调用

    matlab中写个函数,在主程序中调用该函数的方法 跟其它的编程语言都一样,但是子函数与主函数要存于不同的文件中,文件名就是函数名字.文件必须保存在current directory中,才能调用. 函 ...

  5. 给Eclipse提速的7个技巧(转)

    本文由 ImportNew - 孙 波翔 翻译自 nicolasbize.欢迎加入翻译小组.转载请参见文章末尾的要求. 大约一个月前,我发表了一篇博客,其中介绍了对Eclipse的爱与恨. 有些人问我 ...

  6. ABAP文本编辑框操作

    * 1.创建文本框 DATA: g_container TYPE REF TO cl_gui_custom_container, g_editor TYPE REF TO cl_gui_textedi ...

  7. P1571: [Usaco2009 Open]滑雪课Ski

    DP. ; var t,s,n,i,j,m,l,a,c,d:longint; f,e:array[..,..maxn] of longint; q:array[..] of longint; g:ar ...

  8. 软件工程实践小队Scrum Meeting

    例会记录 时间:2013年10月20日星期日 Part 1 会议要点: 1. 小组讨论PM.Dev.Test的各自特点: 2. 小组讨论我们的项目网上教学问答系统的相关问题: 3.确定小组成员在第一轮 ...

  9. PSPO表格

    一.项目计划总结: 周活动总结表 日期         任务 听课 编写程序 阅读课本 准备考试 日总计 周日 周一 周二 300 100 30 430 周三 100 50 30 180 周四 200 ...

  10. 团队开发NABC特点

    一.软件特点 我们所设计的躲避小球游戏,能够防止用户沉迷,且不会使用户有挫败感,失去玩游戏的兴趣. 二.进行NABC分析 N:我们适应于用户对娱乐.打发时间需求 A:我们用图形界面实现 B:此游戏适用 ...