Android_读书笔记_1

线程及异步操作

大体上阐述了异步处理的重要性,以及什么时候应该用异步处理等等巴拉巴拉......

重点:

1:

AsyncTask类的介绍及例子......

通过继承AsyncTask类并实现其定义的事件方法,管理后台操作。

很方便的是AsyncTask类已经为异步操作创建好了一个简单的接口,我们只需实现这个接口就可以很快捷的实现异步操作。

并且在最新的几个SDK中,它能够通过若干个物理内核和一个内部线程池来同时管理多个任务。

包括:

onPreExecute()方法在后台操作开始前运行在UI线程上

doInBackground()方法运行在后台并处理后台操作

从该方法中调用publishProgress()方法能够周期性的通知UI线程有关后台操作的进度

当其( doInBackground()方法 )调用publishProgress()方法时

onProgressUpdate()方法就会在UI线程中运行,通过不同的参数来传递不同的信息

一旦后台操作完成,就会自动在UI线程中调用onPostExrcute()方法,AsyncTask类能够以后台的方式处理操作,不会阻塞UI线程。

启动方法有2种:

1.实例化所创建的AsyncTask子类,调用execute()方法,启动异步操作。

2.实例化所创建的AsyncTask子类,调用executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR,
Integer... )方法,启动异步操作。

区别:API L11+的设备中,前者( execute() )
任务可以”平行“的被执行,在多核处理器设备上,该方法能有效地提高任务的完成速度,并隐性的提高应用程序的效率和流畅性。后者( executeOnExecutor(
AsyncTask.THREAD_POOL_EXECUTOR, Integer... ) )则保证了同时执行若干个任务,每个任务相互独立。

注:如果不想同时执行多个任务,可以调用executeOnExecutor( AsyncTask.SERIAL_EXECUTOR )方法,但是只有再API
L14+中才能确认是线性的。

实例:

 1 package com.example.asynctask;
2
3 import android.os.AsyncTask;
4 import android.os.Bundle;
5 import android.os.SystemClock;
6 import android.app.Activity;
7 import android.widget.TextView;
8
9 public class SimpleAsyncTask extends Activity {
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_main);
15
16 CountingTask tsk = new CountingTask();
17 tsk.execute();
18
19 }
20
21 private class CountingTask extends AsyncTask<Void, Integer, Integer> {
22
23 CountingTask() {
24 }
25
26 @Override
27 protected Integer doInBackground(Void... unused) {
28
29 int i = 0;
30 while (i < 100) {
31
32 SystemClock.sleep(100);
33 i++;
34
35 if (i % 5 == 0) {
36
37 // 每5%进度更新一次UI
38 publishProgress(i);
39 }
40 }
41
42 return i;
43 }
44
45 protected void onProgressUpdate(Integer... progress) {
46
47 TextView tv = (TextView) findViewById(R.id.text);
48 tv.setText(progress[0] + " % Complete! ");
49 }
50
51 protected void onPostExecute(Integer result) {
52
53 TextView tv = (TextView) findViewById(R.id.text);
54 tv.setText("Count Complete ! Count to " + result.toString());
55 }
56 }
57 }

execute()实现

 1 package com.example.asynctask;
2
3 import android.app.Activity;
4 import android.os.AsyncTask;
5 import android.os.Bundle;
6 import android.os.SystemClock;
7 import android.widget.TextView;
8
9 public class SimpleMultiCoreAsyncTask extends Activity {
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_simple_multi_core_async_task);
15
16 CountingTask tsk = new CountingTask();
17 tsk.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, R.id.tv_AsyncTask_1 );
18
19 startParallelTask( R.id.tv_AsyncTask_2 );
20 startParallelTask( R.id.tv_AsyncTask_3 );
21 startParallelTask( R.id.tv_AsyncTask_4 );
22 startParallelTask( R.id.tv_AsyncTask_5 );
23 startParallelTask( R.id.tv_AsyncTask_6 );
24
25 //注意,貌似只能第一时间同时启动前5个,完成后才会启动第6个......
26 }
27
28 private void startParallelTask( int _id ) {
29
30 CountingTask tsk = new CountingTask();
31 tsk.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, _id );
32 }
33
34 private class CountingTask extends AsyncTask<Integer, Integer, Integer> {
35
36 private int _counterID;
37
38 CountingTask() {
39 }
40
41 @Override
42 protected Integer doInBackground(Integer... _id) {
43
44 _counterID = _id[ 0 ];
45 int i = 0;
46
47 while (i < 100) {
48
49 SystemClock.sleep(100);
50 i++;
51
52 if (i % 5 == 0) {
53
54 // 每5%进度更新一次UI
55 publishProgress(i);
56 }
57 }
58
59 return i;
60 }
61
62 protected void onProgressUpdate(Integer... progress) {
63
64 TextView tv = (TextView) findViewById( _counterID );
65 tv.setText(progress[0] + " % Complete! ");
66 }
67
68 protected void onPostExecute(Integer result) {
69
70 TextView tv = (TextView) findViewById( _counterID );
71 tv.setText("Count Complete ! Count to " + result.toString());
72 }
73 }
74 }

executeOnExecute()实现

------------------------------------------------我是分割线--------------------------------------------------------------

2:Thread类

比起上面的( AsyncTask ) ,其( Thread )类导入已有的代码更为简便直接

对于一个拥有独立线程的Activity类能够管理线程的生命周期,一般就会包括一个Handler类型的变量,Thread类被实例化启动时,Handler的post()方法就会被用于与主UI线程的通信,当然也可以使用Activity类中的runOnThread()方法或是View类中的post()和postDelayed()方法来与主UI线程通信。

实例:

 1 package com.example.asynctask;
2
3 import android.os.Bundle;
4 import android.os.SystemClock;
5 import android.app.Activity;
6 import android.view.Menu;
7 import android.widget.TextView;
8
9 public class SimpleThread extends Activity {
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_simple_thread);
15
16 final TextView tv_thread = ( TextView ) findViewById( R.id.tv_thread );
17
18 new Thread( new Runnable() {
19
20 @Override
21 public void run() {
22
23 int i = 0;
24
25 while ( i < 100 ) {
26
27 SystemClock.sleep( 250 );
28 i++;
29
30 final int curCount = i;
31
32 if( curCount % 5 == 0 ) {
33
34 tv_thread.post( new Runnable() {
35
36 @Override
37 public void run() {
38
39 tv_thread.setText( curCount + " % Complete! " );
40 }
41 });
42 }
43 }
44
45 tv_thread.post( new Runnable() {
46
47 @Override
48 public void run() {
49
50 tv_thread.setText( "Count Complete!" );
51 }
52 });
53 }
54 }).start();
55 }
56 }

Thread()实现

Android_读书笔记_1

时间: 2024-10-11 16:28:06

Android_读书笔记_1的相关文章

Android_读书笔记_2

感觉Service有些纠结,不知道是不是因为书本的原因,书上的例子一个都没成功,看的也是晕头转向的. 一同提到了4个东西,前面嘛自然是那些巴拉巴拉的介绍,直接正题. 重点: 1.创建一个服务(Service); Android中Service是一个很重要的元素之一,一个 "服务"涉及到Service类的继承,以及在AndroidManifest.xml中添加相关权限许可代码 再者就是 Service类的基础方法,onCreate(), onBind(), onStart(), onSt

Android_读书笔记_3

简单的广播与( Intent )接收. 在Android中很多很多地方都会使用到广播,操作系统使用广播讲信息传递到其他的应用程序中去,也会产生很多设备状态的广播......唉,算了算了,嘿嘿 一.广播 Android框架支持的广播有两种类型:普通广播( normal broadcast )和有序广播( ordered boradcast ), i> 前者将异步的送达到所有的接收器,没有特定的顺序,而后者则按照一定的顺序依次送达广播事件,接收器可以将事件继续传递给队列中的下一个接收器,也可以对其进

构建之法读书笔记_1

本周我快速地阅读了一遍<构建之法>,提出以下几个问题: 1在满足客户需要的同时,我们有些什么原则需要坚持. 2软件测试方法有什么?做软件测试只是找BUG吗? 3什么是敏捷流程?怎样去根据自己的项目选择开发方法? 4第三章中有提及考级的相关内容,但是在社会工作中,实践经验比证书更重要,我们应该如何平衡理论知识与实践之间的关系? 5当今市场对软件有哪些主要需求,安全软件并不能填满所有的漏洞,它的发展前景真的有那么好吗?

《C#图解教程》读书笔记之三:方法

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.方法那些事儿 (1)方法的结构:方法头-指定方法的特征,方法体-可执行代码的语句序列: (2)方法的调用:参数.值参数.引用参数.输出参数.参数数组: ①参数: 形参-本地变量,声明在参数列表中:形参的值在代码开始之前被初始化: 实参-实参的值用于初始化形参: ②值参数: 为形参在栈上分配内存,将实参的值复制到形参: ③引用参数: 不为形参在栈上分配内存,形参的参数名作为实参变量的别名指向同一位置,必须使用ref关

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

简要做个笔记,以备忘. 需同步的原因是,我们并发访问了共享资源.我们将访问或操作共享资源的代码段称"临界区",如果两个执行线程处于同一临界区中同时执行,称"竞争条件".这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程.一个中断处理程序或一个内核线程. 举个简单例子,i++操作.该操作可以转换为下面的机器指令序列: 1.得到当前变量i的值,并保存到一个寄存器. 2.将寄存器的值加1. 3.将i的新值写回到内存中. 当两个线程同时进入这个临界区,若i初值

鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理

这一章主要讲述的是如何操作与管理Linux系统中的文件和目录,主要包括目录间的切换,目录的创建与删除,文件的创建与删除,文件的查找,文件内容的查看等等. 前一章中已经讲过相对路径以及绝对路径,绝对路径就是指从根目录("/")开始写起的路径名,而相对路径绝不会由根目录开始写起,相反,相对路径是相对于当前工作目录的路径名.Linux操作系统中有几个特殊的目录: . 代表此层目录: .. 代表上一层目录: - 代表前一个工作目录: ~ 代表当前用户身份所在的主文件夹: ~account 代表

《30天自制操作系统》读书笔记(2)hello, world

让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复. 我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,