Android线程和进程

Similar documents
01_Service

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

Android Service

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

Chapter 9: Objects and Classes

智能移动平台应用开发6 Android组件通信2 消息机制

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

投影片 1

建立Android新專案

建模与图形思考

Android 编程基础 Android 开发教程 & 笔记 1

新・解きながら学ぶJava

RecyclerView and CardVew

Microsoft Word - 01.DOC

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

Android Fragment

Dynamic Layout in Android

untitled

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

untitled

第四章 Android 事件处理 一 学情分析前面我们学习了 Android 提供的一些强大的界面组件, 这些组件主要是用来进行数据显示, 如何用户想进行交互, 实现具体的功能, 则还需要相应事件处理进行辅助 当用户在程序上执行各种操作是, 如单机一个按钮, 应用程序必须为用户提供相应动作, 这种响

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

<4D F736F F F696E74202D20B8DFBCB6D3C3BBA7BDE7C3E6D3EBB6E0CFDFB3CC2E707074>

手说TTS开发指南

Microsoft Word - 第5章.doc

RxJava

Guava学习之Resources

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

提纲 1 2 OS Examples for 3

Microsoft PowerPoint - ch6 [相容模式]

建模与图形思考

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

Java

「西醫基層總額支付委員會《第28次委員會議紀錄

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

《大话设计模式》第一章

南京市人才服务中心

< Essential LEDtube > | < Philips >

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft Word - 第4章 3D相册.doc

软件工程文档编制

Android + WebService

EJB-Programming-4-cn.doc

Microsoft Word - weather12 刷新按钮动画+搜索框+bug处理.docx

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Microsoft PowerPoint - plan08.ppt

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

使用Cassandra和Spark 2.0实现Rest API服务

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

ii Vue Bootstrap 4 ES 6 Vue Vue Bootstrap 4 ES 6 Vue 2 vue html vue html vue Vue HTML 5 CSS ES 6 HTML 5 CSS Visual Studio Code h

1.5招募说明书(草案)

可 Web 编程的NativeUI 设计与实现

while (queue.isempty() && newtasksmaybescheduled) queue.wait(); if (queue.isempty()) break; // Queue is empty and will forever remain; die if (!taskfi

untitled

PowerPoint 演示文稿

南華大學數位論文

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

chp6.ppt

Chapter 9: Objects and Classes

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

Microsoft Office SharePoint Server MOSS Web SharePoint Web SharePoint 22 Web SharePoint Web Web SharePoint Web Web f Lists.asmx Web Web CAML f

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

Microsoft Word - Broker.doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Android + NFC

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Android Android Android SDK iv

untitled

Microsoft Word - ch04三校.doc

0511-Android程式之GPS應用_專題週記4

Lecture01_Android介绍

14

基于ECO的UML模型驱动的数据库应用开发1.doc

mvc

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

拦截器(Interceptor)的学习

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

EJB-Programming-3.PDF

无类继承.key

untitled

幻灯片 1

Android 开发教程

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

内文-2.indd

untitled

Transcription:

Android 进程和线程

版权声明 华清远见教育集团版权所有 ; 未经华清远见明确许可, 不得为任何目的以任何形式复制或传播此文档的任何部分 ; 本文档包含的信息如有更改, 恕不另行通知 ; 华清远见教育集团保留所有权利

Android 进程和线程 在安装 Android 应用程序的时候,Android 会为每个程序分配一个 Linux 用户 ID, 并设置相应的权限, 这样其它应用程序就不能访问此应用程序所拥有的数据和资源了 下图中, 两个 Android 应用程序, 各自运行在其自己的基本沙箱或进程上 它们有不同的 Linux user ID

Android 进程和线程

Android 进程和线程 当一个程序第一次启动时,Android 会同时启动一个对应的主线程 (Main Thread), 主线程主要负责处理与 UI 相关的事件, 如 : 用户的按键事件, 用户接触屏幕的事件以及屏幕绘图事件, 并把相关的事件分发到对应的组件进行处理 所以主线程通常又被叫做 UI 线程 在开发 Android 应用时必须遵守单线程模型的原则 : Android UI 操作并不是线程安全的并且这些操作必须在 UI 线程中执行

Android 进程和线程 如果在非 UI 线程中直接操作 UI 线程, 会抛出 android.view.viewroot$calledfromwrongthrea dexception: Only the original thread that created a view hierarchy can touch its views 由于 UI 线程负责事件的监听和绘图, 因此, 必须保证 UI 线程能够随时响应用户的需求,UI 线程里的操作应该像中断事件那样短小, 费时的操作 ( 如网络连接 ) 需要另开线程, 否则, 如果 UI 线程超过 5s 没有响应用户请求, 会弹出对话框提醒用户终止应用程序

Android 进程与线程 如果在新开的线程中需要对 UI 进行设定, 就可能违反单线程模型, 因此 android 采用一种复杂的 Message Queue 机制保证线程间通信 Message Queue 是一个消息队列, 用来存放通过 Handler 发布的消息 Android 在第一次启动程序时会默认会为 UI thread 创建一个关联的消息队列, 可以通过 Looper.myQueue() 得到当前线程的消息队列, 用来管理程序的一些上层组件, 如 Activities BroadcastReceivers 等等 你可以在自己的子线程中创建 Handler 与 UI thread 通讯

Handler 消息传递机制 Android 通过 Looper Handler 来实现消息循环机制, Android 消息循环是针对线程的 ( 每个线程都可以有自己的消息队列和消息循环 ) Android 系统中,Looper 负责管理线程的消息队列和消息循环 我们可以通过 Loop.myLooper() 得到当前线程的 Looper 对象, 通过 Loop.getMainLooper() 可以获得当前进程的主线程的 Looper 对象 一个线程可以存在 ( 当然也可以不存在 ) 一个消息队列和一个消息循环 (Looper) 构造 Handler 的时候可以指定一个 Looper 对象, 如果不指定则利用当前线程的 Looper 创建

Handler 消息传递机制

Handler 消息传递机制 在 Android 平台中, 新启动的线程是无法访问 Activity 中的 Widget 的, 当然也不能将运行状态传递出来, 这就需要有 Handler 机制了 另外, 正如前面所说, 我们希望能在一个子线程中获取数据并将其显示到界面上, 如果直接在子线程中设置界面, 则将会报错 (android.view.viewroot$calledfromwrongthr eadexception), 此时也需要使用 Handler 来处理

Handler 方法 描述 void handlemessage(message message) boolean sendemptymessage(int what) 通过这个方法接收消息 发送只有一个 what 值的消息 boolean sendmessage(message message) boolean hasmessage(int what) 发送消息到 Handler,Handler 即可用 handlemessage 处理 判断是否有 what 值的消息 boolean post(runnable r) 将一个线程添加到消息队列

Handler Example 1

Handler Example 2

AsyncTask Handler 和 AsyncTask, 都是为了不阻塞主线程 (UI 线程 ), 且 UI 的更新只能在主线程中完成, 因此异步处理是不可避免的 要使用 AsyncTask, 需要自己编写一个类, 继承 AsyncTask 类, 并且实现其中的方法 AsyncTask 定义了三种泛型类型 Params,Progress 和 Result, 即 AsyncTask<Params,Progress,Result> Params 启动任务执行的输入参数, 比如 HTTP 请求的 URL Progress 后台任务执行的百分比 Result 后台执行任务最终返回的结果, 比如 String

AsyncTask AsyncTask 的执行分为四个步骤, 每一步都对应一个回调方法, 开发者需要实现至少一个方法 (doinbackground(params...)) 这些方法都是回调方法, 在任务的执行过程中, 这些方法被自动调用 : onpreexecute(): 该方法将在执行实际的后台操作前被 UI thread 调用 可以在该方法中做一些准备工作, 如在界面上显示一个进度条 doinbackground(params...),: 将在 onpreexecute 方法执行后马上执行, 该方法运行在后台线程中 这里将主要负责执行那些很耗时的后台计算工作 该方法是抽象方法, 子类必须实现 在这个方法中可以调用 publishprogress() 方法来更新实时的任务进度

AsyncTask onprogressupdate(progress...): 在 publishprogress 方法被调用后,UI thread 将调用这个方法从而在界面上展示任务的进展情况, 例如通过一个进度条进行展示 onpostexecute(result): 在 doinbackground 执行完成后,onPostExecute 方法将被 UI thread 调用, 后台的计算结果将通过该方法传递到 UI thread.

AsyncTask 使用 AsyncTask 类, 以下是几条必须遵守的准则 : Task 的实例必须在 UI thread 中创建 execute 方法必须在 UI thread 中调用 不要手动的调用 onpreexecute(), onpostexecute(result), doinbackground(params...), onprogressupdate(progress...) 这几个方法 该 task 只能被执行一次, 否则多次调用时将会出现异常

AsyncTask

AsyncTask 一开始要在 res 文件夹底下新增两个 XML 文件, 接着将一开始新增的两个 XML 文件, 作为两个 View, 并使用 ViewSwitcher 的方法去做两个 View 之间的切换 当按下 更多 的按钮时,ViewSwitcher 就会切换到另外一个 View, 当后台任务处理完成后, 才会切换回原本的 View

AsyncTask 布局文件 (res/layout/button.xml): <?xml version="1.0" encoding="utf-8"?> <!-- 使用 ViewSwitcher 切换的第一个 View--> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/btn_loadmorecontacts" android:text=" 更多..." android:layout_width="fill_parent" android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:minheight="?android:attr/listpreferreditemheight" android:textcolor="#ffffff" android:background="@android:drawable/list_selector_backgro und" android:clickable="true" android:onclick="onclick" />

AsyncTask 布局文件 (res/layout/progress.xml): <?xml version="1.0" encoding="utf-8"?> <!-- 使用 ViewSwitcher 切换的第二个 View--> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:id="@+id/relativelayout1" android:minheight="?android:attr/listpreferreditemheight"> <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centervertical="true" /> <TextView android:text="loading " android:textappearance="?android:attr/textappearancelarge" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_torightof="@+id/progressbar" android:layout_centervertical="true" android:gravity="center" android:padding="10dip" android:textcolor="#ffffff" /> </RelativeLayout>

AsyncTask public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); switcher = new ViewSwitcher(this); button = (Button) View.inflate(this, R.layout.button, null); button.setonclicklistener(this); progress = (RelativeLayout) View.inflate(this, R.layout.progress, null); /* 将 button 与 progressbar 加入 switcher 中 */ switcher.addview(button); switcher.addview(progress); /* 取得 ListView 并将 switcher 加入 */ getlistview().addfooterview(switcher); /* 设定 ListAdapter, 其中第二个参数可选择样式 */ setlistadapter(new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, ITEMS)); }

AsyncTask private class GetMoreItemsTask extends AsyncTask<Object,Object,Object> { @Override protected Object doinbackground(object... params) { /* 此处可编写后台任务的程序代码 */ try { /* 线程调用 sleep 方法, 实际项目中应该是执行耗时操作 */ Thread.sleep(3000); } catch (InterruptedException e) { e.printstacktrace(); } return null; } @Override protected void onpostexecute(object result) { switcher.showprevious(); } }

Activity.runOnUiThread(Runnable ) 另外, 在 Activity 中也定义了一个 runonuithread(runnable) 方法, 用于处理 UI 线程的问题 : public void onclick( View v ) { new Thread( new Runnable() { public void run() { // 耗时操作 Activity.runOnUiThread( new Runnable() { mytext.settext( 来自网络的信息 ); }); } }).start(); }

View.post() 和 View.postDelayed() 在 View 中, 也定义了 View.post(Runnable)/ View.postDelayed(Runnable, long) 两个方法来处理 View 的线程问题 postdelayed 可以指定任务的延迟时间 ( 毫秒 ) public void onclick( View v ) { new Thread( new Runnable() { public void run() { // 耗时操作 mytext.post( new Runnable() { mytext.settext(...); }); } }).start(); }

Q&A