`

android进程与线程详解二:线程(转)

 
阅读更多

线程

 

当一个应用被启动,系统创建一个执行线程,叫做"main"。这个线程是十分重要的,因为它主管向用户界面控件派发事件。其中包含绘图事件。它也是你的应用与界面工具包(android.widgetandroid.view包中的组件)交互的地方。于是main线程也被称为界面线程。

 

系统不会为每个组件的实例分别创建线程。所有运行于一个进程的组件都在界面线程中被实例化,并且系统对每个组件的调用都在这个线程中派发。 结果,响应系统调用的方法(比如报告用户动作的onKeyDown()或一个生命周期回调方法)永远在界面线程中进行。

 

例如,当用户触摸屏幕上的一个按钮时,你的应用的界面线程把触摸事件派发给控件,然后控件设置它的按下状态再向事件队列发出一个自己界面变得无效的请求,界面线程从队列中取出这个请求并通知这个控件重绘它自己。

 

当你的应用在响应用户交互时需执行大量运算时,这种单线程的模式会带来低性能,除非你能正确的优化你的程序。特别的,如果所有事情都在界面线程中发生,执行比如网络连接或数据库请求这样的耗时操作,将会阻止整个界面的响应。当线程被阻塞时,就不能派发事件了,包括绘图事件。从用户的角度看,程序反应太慢了。甚至更糟的是,如果界面线程被阻塞几秒钟(大5秒钟吧),用户就户抱怨说程序没反应了,用户可能因而退出并删掉你的应用。


此外,Andoid界面不是线程安全的。所以你绝不能在一个工作线程中操作你的界面—你只能在界面线程中管理的你的界面。所以,对于单线程模式有两个简单的规则:

1不要阻塞界面线程

2不要在界面线程之外操作界面。

 

工作线程

由于上述的单线程模式,不要阻塞你的界面线程以使你的应用的界面保持响应是非常重要的,那么如果你有不能很快完成的任务,你应把它们放在另一个线程中执行(后台线程或工作线程)

例如,下面是的代码是响应click事件,在另外一个线程中下载一个图片并在一个ImageView中显示它:

[java] view plaincopy
 
  1. public void onClick(View v) {  
  2.     new Thread(new Runnable() {  
  3.         public void run() {  
  4.             Bitmap b = loadImageFromNetwork("http://example.com/image.png");  
  5.             mImageView.setImageBitmap(b);  
  6.         }  
  7.     }).start();  
  8. }  


第一眼,这看起来能很好的工作,因为它创建了一个新线程来进行网络操作。然而它违反了第二条规则:不要在界面线程之外操作界面—它简单的在工作线程中修改了ImageView。这会导至未定义的异常出现,并且难以调试追踪。


为了能改正这个问题,Android提供了很多从其它线程来操作界面的方法。下面是可用的方法们:

1 Activity.runOnUiThread(Runnable)

2 View.post(Runnable)

3 View.postDelayed(Runnable,long)


例如,你可以用View.post(Runnable)来修正上面的问题:

[java] view plaincopy
 
  1. public void onClick(View v) {  
  2.     new Thread(new Runnable() {  
  3.         public void run() {  
  4.             final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");  
  5.             mImageView.post(new Runnable() {  
  6.                 public void run() {  
  7.                     mImageView.setImageBitmap(bitmap);  
  8.                 }  
  9.             });  
  10.         }  
  11.     }).start();  
  12. }  

 

现在这个实现终于是线程安全的了:网络操作在另一个线程中并且ImageView在界面线程中改变。

 

这里的view.post方法使用就相当于向主线程的消息队列里发送一个Runnable,再让它来执行,就实现了主线程更新UI

分享到:
评论

相关推荐

    Android Task 进程与线程详解

    "Android Task 进程与线程详解" Android 中的 Task 概念是指一组以栈的模式聚集在一起的 Activity 组件集合,具有潜在的前后驱关联。Task 的主要作用是将组件之间的连接,从进程概念的细节中剥离出来,可以以一种...

    详解Android进程和线程

    Android进程和线程是Android应用程序运行的基础,理解这两个概念对于开发高质量的Android应用至关重要。在Android系统中,每个应用都是一个独立的Linux进程,这意味着它们在各自的沙箱环境中运行,互不影响,提高了...

    Android多线程处理 详解

    #### 二、Android进程的重要性和管理 **Android根据进程的重要性和可见性将其分为五个级别:** 1. **前台进程(Foreground Process):** 包含用户当前正在交互的组件,如处于运行状态的Activity。这类进程优先级...

    Android进程和线程详解

    Android进程和线程详解.当启动一个应用程序组件时,如果该应用没有正在运行的其它程序组件,那么Android系统将为这个应用创建一个新进程(包含一个线程)用于运行应用。  当启动一个应用程序组件时,如果该应用没有...

    Android进程结束杀掉子线程Demo

    http://blog.csdn.net/qq_28690547/article/details/50375997;关于demo的文章详解,有兴趣的童鞋可以看看,解决popupwindow/dialog的BadTokenException异常

    Android多线程详解.pdf

    本文将深入探讨Android中的多线程,包括线程类的基本方法、进程与线程的区别、线程间通信以及Java中实现线程的方式。 首先,让我们了解Thread类的一些常用方法: 1. `currentThread()`:返回当前正在执行的线程...

    android多线程handler/message机制详解

    Android 多线程Handler/Message机制详解 Android 多线程机制是 Android 应用程序中最重要的组件之一,它允许应用程序在后台执行一些操作,而不影响用户的交互体验。在 Android 中,多线程机制是基于 Handler 和 ...

    Android底层结构-Service线程详解

    ### Android底层结构——Service线程详解 #### 一、引言 在Android系统中,`Service` 是一种可以在后台长时间运行的应用组件,它并不提供用户界面。`Service` 在Android应用开发中的作用十分重要,比如音乐播放器...

    Android 线程 多线程 Multi-thread

    ### Android中的线程与多线程技术详解 在Android开发中,线程和多线程技术是实现应用程序高效运行的关键所在。本篇文章将详细介绍Android线程的基础知识、使用方法及同步机制等内容。 #### 一、Android线程概述 ...

    android多线程

    ### Android多线程详解 #### 一、进程与线程概览 在深入探讨Android多线程之前,我们首先理解进程和线程的基本概念。**进程**是正在运行的程序实例,每个进程拥有自己独立的内存空间和系统资源。而**线程**则是...

    Android&Java的线程框架与模式_高焕堂_PDF.rar

    第二章“Java线程详解”(Thread_Ch02_JavaThread_ok.pdf)深入探讨了Java平台下的线程机制,包括线程间的通信和协作,如wait()、notify()和notifyAll()方法,以及线程的中断和异常处理。此外,还介绍了线程池...

    Android 应用程序模块 应用, 任务, 进程, 和线程--千锋培训

    【Android 应用程序模块详解】 在Android应用开发中,理解应用程序模块、任务(Tasks)、进程(Processes)和线程(Threads)的概念至关重要。这些组件是构建高效、响应且资源管理良好的应用程序的基础。 1. **...

    android多线程模型和service分析

    Android应用运行在一个主进程的主线程中,也被称为UI线程或主GUI线程,负责处理所有与用户界面相关的事件。然而,当应用程序执行一些耗时操作,如网络请求、数据库查询或复杂的计算时,如果在主线程中进行,将导致UI...

    Android多线程程序设计

    ### Android多线程程序设计详解 #### 一、程序、进程和线程的基本概念 在深入探讨Android中的多线程程序设计之前,我们先来了解一下基本的概念:程序、进程和线程。 - **程序**:是指一段静态的代码,它是应用...

    Android开发中的多线程编程技术

    ### Android开发中的多线程编程技术详解 #### 一、多线程编程的重要性与挑战 在Android开发过程中,多线程编程技术对于提高应用程序的性能和用户体验至关重要。然而,多线程编程因其复杂性和抽象性常常让开发者...

    Android中线程间通信.pdf

    ### Android中线程间通信详解 #### 一、引言 在Android开发中,线程间的通信是一项重要的技术。为了确保应用的响应性和流畅性,开发者必须了解如何正确地管理和同步多个线程之间的数据交换。本文将深入探讨Android...

    Android系统架构详解

    ### Android系统架构详解 #### 一、概述 Android操作系统是一个基于Linux内核的移动设备操作系统,广泛应用于智能手机和平板电脑等移动终端。Android系统架构由五个主要组成部分构成:Linux Kernel、Android ...

    android 线程同步

    ### Android线程同步详解 在Android开发过程中,线程同步是一项非常重要的技术,它能够确保多线程环境下的数据安全性和程序稳定性。本文将详细解析Android中的线程同步机制,包括Mutex、Condition以及Barrier等核心...

Global site tag (gtag.js) - Google Analytics