`
dengzhangtao
  • 浏览: 666456 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android,UI主线程与子线程

 
阅读更多
在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process的主线程上,所以在默认设置下,service需要开线程来处理I/O等操作。
摘至API guides:
Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work. By using a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the application's main thread can remain dedicated to user interaction with your activities.


设置<service android:name=".controler.service.PlayerService" android:process=":remote"/>
对服务使用另一个进程,这样在服务里面进行耗时的操作。主线程还是不影响的

        一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。
  
       在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一 个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行, 以免阻塞主线程。


那么,UI Thread如何和其他Thread一起工作呢?常用方法是:
        诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。

       例如,在子线程的状态发生变化时,我们需要更新UI。如果在子线程中直接更新UI,通常会抛出下面的异常:
  
        11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.


service有两种启动方式,一种是直接startservice方式启动,这样启动的service是一个单独运行的,并不会随着activity的关闭而关闭,也就是说这种方式启动的service的生命周期和activity的是没有关联的。还有一种是通过binder的方式吧,这样启动的service的生命周期和activity是相同的,也就是说当activity关闭的时候此service也停止了
分享到:
评论

相关推荐

    Android主线程和子线程区别详解

    主线程和子线程的区别 每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。 线程唯一标示符:Thread.Current... Main函数为主线程,id标示符与UI界面主线程相等 不多说了。看下面的测试代码注释吧。 pu

    安卓UI线程和子线程通讯更新UI实例

    Android ,非MainActivity类中的子线程和UI线程通讯,并且获取子线程传递的信息,更新UI界面。需要使用okHttp类库

    android中UI主线程与子线程深入分析

    主要介绍了android中UI主线程与子线程,以实例形式较为深入的分析了UI主线程与子线程的运行原理与操作技巧,有助于深入了解Android程序设计,需要的朋友可以参考下

    python主线程与子线程的结束顺序实例解析

    这篇文章主要介绍了python主线程与子线程的结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引用自 主线程退出对子线程的影响 的一段话: 对于...

    android主线程和子线程之间消息传递详解

    主要介绍了android主线程和子线程之间消息传递详解,主线程发送消息到子线程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Android的线程使用来更新UI

    Android 线程 更新UI 操作UI

    Android Handler主线程和一般线程通信的应用分析

    Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个...

    python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例

    在做界面开发时,无论是移动端的Android,还是我们这里讲的PyQt5,经常会有一个界面开发准则,那就是UI主线程与耗时子线程一定要分开,主线程负责刷新界面,耗时操作,如网络交互、磁盘IO等,都应该放在子线程里执行...

    Android线程与消息机制讲解与源码例程

    3)源码例程是举例:用户子线程进行定时,每到一定的时间后用户子线程以消息的方式发送给UI主线程,UI主线程接受到子线程的消息后,改变界面显示(图片会闪烁) 并且可以控制用户子线程的运行与禁止

    android多线程

    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行...

    Android中AsyncTask实现多线程计数

    Android中AsyncTask实现多线程计数,UI主线程运行,启动另一个线程计数并在UI主线程上显示.

    Android 线程开发 开发实例

    我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和...

    android 服务组件多线程交互

    android 的service和activity是运行在UI主线程的。在android线程中,只有主线程即UI线程有自己的默认的消息队列。子线程需要创建自己的消息队列,并把消息发给队列,并循环起来,发给handler处理。

    Android项目设计与开发:UI线程冲突.ppt

    嵌入式Android项目设计与开发 第七章 多线程 ——(2)UI线程冲突 多线程 即使Android可以使用线程, 但规定不能使用子线程修改主线程的内容。 多线程 可以考虑在子线程中使用runOnUiThread重新载入UI线程,并干预...

    android 学习笔记5-线程阻塞 UI更新

    1、查看网络上的图片 2、主线程阻塞-ANR 3、刷新UI-Handler 4、在本地缓存图片-例如微信的图片 5、获取开源代码 6、显示一个新闻客户端 7、使用GET方式提交表单数据 8、使用POST方式提交表单

    Android的消息处理机制

    详细描述了Android的UI主线程和子线程的消息通信机制,提供了一些参考代码

    子线程和主线程5种交互方式 Demo

    android 中的五中子线程和主线程交互方式,可针对整个activity的UI或者单个View

    异步线程AsyncTask

    首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android为了降低这个开发难度 提供了AsyncTask AsyncTask就是一个封装过的...

Global site tag (gtag.js) - Google Analytics