学习目的:1.了解android线程的使用 2.了解主线程与子线程区别 3.解析异步处理机制
主线程与子线程:所谓主线程,在Windows窗体应用程序中一般指UI线程,这个是程序启动的时候首先创建的线程。而子线程,一般指为了完成某个特殊任务,并行于主线程的其他线程。例如让一个窗体单独开一个线程,去远程数据库中取得数据资料,下载并且保存到本地文件中。
所以,主线程和子线程是构建于线程这个通用概念上的人为的习惯称呼,并不是什么官方的固有专用词语。
MainActivity(简而言之,为实现某个功能而创建爱的线程是子线程)

1.了解android线程的使用(例:在子线程更新UI)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class  extends AppCompatActivity implements View.OnClickListener {

      protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
Button changeText = (Button) findViewById(R.id.change_text);
changeText.setOnClickListener(this);
} public void onClick(View v) {
switch (v.getId()) {
case R.id.change_text:
new Thread(new Runnable() { public void run() {
test.setText("Nice to meet you");
}
}).start();
break;
default:
break;
}
} }

logcat报错(说明不能在子线程更新UI)修改如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class  extends AppCompatActivity implements View.OnClickListener {

    public static final int UPDATE_TEXT = 1;

    private TextView text;

    private Handler handler = new Handler() {

        public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT: text.setText("Nice to meet you");
break;
default:
break;
}
} }; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mai 大专栏  androidthreadtestn);
text = (TextView) findViewById(R.id.text);
Button changeText = (Button) findViewById(R.id.change_text);
changeText.setOnClickListener(this);
} public void onClick(View v) {
switch (v.getId()) {
case R.id.change_text:
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message); // 将Message对象发送出去
}
}).start();
break;
default:
break;
}
} }

3.解析异步处理机制(Message MessageQueue Looper Handler四个部分)
异步处理机制的核心思想:一条Message经过如下转展调用,从子线程进入主线程,从而使不能更新UI变成可以更新UI

4.使用AsyncTask类(更方便的进行UI操作)

1
class DownloadTask extends AsyncTask<Void Integer Boolean>{...}//

三个参数
Params:执行AsyncTask需要传入的参数
Progress:后台任务执行时,需要在当前界面显示进度
Result:返回值类型

还需重写四个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class DownloadTask extends AsyncTask<Void Integer Boolean>{
@verride
protected void onPreExecute(){
progressDialog.show();//显示进度对话框
}
@verride
protected Boolean doInBackground(void... Params){
try{
while(true){
int downloadPercent=doDownload();//这是一个虚构的方法
publishProgress(downloadPercent);
if(downloadPercent>=100){
break;
}
}catch(Exception e){
return false;
}
return true;
} }
@verride
protected void onProgressUpdata(Integer... values){
//在这里更新下载进度
progressDialog.setMessage("Download"+values[0]+"%");
}
@verride
protected void onPostExecute(Boolean result){
progressDialog.dismiss();//关闭进度对话框
if(result){
Toast.makeText(context,"Download Succeeded",Toast.LENGTH_SHORT).show(); }else{
Toast.makeText(context,"Download Failed",Toast.LENGTH_SHORT).show();
}
}
}

想要启动这个任务

1
new DownloadTask().execute();

androidthreadtest<CODE 2 chaper9>的更多相关文章

  1. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  2. 我们是怎么做Code Review的

    前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...

  3. Code Review 程序员的寄望与哀伤

    一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...

  4. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM

    刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...

  5. 在Visual Studio Code中配置GO开发环境

    一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...

  6. 代码的坏味道(14)——重复代码(Duplicate Code)

    坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...

  7. http status code

    属于转载 http status code:200:成功,服务器已成功处理了请求,通常这表示服务器提供了请求的网页 404:未找到,服务器未找到 201-206都表示服务器成功处理了请求的状态代码,说 ...

  8. Visual Studio Code——Angular2 Hello World 之 2.0

    最近看到一篇用Visual Studio Code开发Angular2的文章,也是一篇入门教程,地址为:使用Visual Studio Code開發Angular 2專案.这里按部就班的做了一遍,感觉 ...

  9. WebStorm 2016 最新版激活(activation code方式)

    WebStorm 2016 最新版激活(activation code方式) WebStorm activation code WebStorm 最新版本激活方式: 今天下载最新版本的WebStorm ...

随机推荐

  1. 简述cookies 和 session

    session HTTP协议本身是无状态的,本身并不能支持服务端保存客户端的状态信息,于是,Web Server中引入了session的概念,用来保存客户端的状态信息. 1)当一个用户向服务器发送第一 ...

  2. You are attempting to install the android sdk inside your android studio installation

    原因 我的android studio文件名为AndroidStudio 我的android studio sdk文件名为AndroidStudioSDK 所以系统把AndroidStudioSDK自 ...

  3. mysql使用联合索引提示字符长度超限制解决办法

    ​ mysql在创建数据库的时候,字符集设置的不是utf8而是utf9mb4,在导入sql脚本的时候,发现提示如下错误: ​ 从上图中,我们可以看出,使用的是innodb及字符集.错误提示是长度太长了 ...

  4. Table布局的优缺点

    总结 Table布局的缺点是比其它html标记占更多的字节,会阻挡浏览器渲染引擎的渲染顺序,会影响其内部的某些布局属性的生效,优点就是用table做表格是完全正确的 Tables的缺点 1.Table ...

  5. ios alamofire4.x网络框架url 中文问题

    一种方式是把参数放到Parameters里面 request 增加 encoding:URLEncoding.default 就可以 还有中文在path上 比如    http://www.chao. ...

  6. windows下pip的安装

    安装地址:https://pypi.python.org/pypi/pip#downloads 下载完成后,找到文件并进行解压,找到下面路径. 打开cmd,cd到当前目录下,然后执行下面命令: pyt ...

  7. PAT甲级——1033 To Fill or Not to Fill

    1033 To Fill or Not to Fill With highways available, driving a car from Hangzhou to any other city i ...

  8. 2017Google开发者大会

    2017年12月14日有幸去上海跨国采购中心参加了2017Google开发者大会,这个大会有很多很有意思的展会以及技术分享.主题涵盖 Android.移动网络.Firebase.机器学习.云服务.AR ...

  9. android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码

    Android精选源码 app 版本更新.下载完毕自动自动安装 android指针式分数仪表盘 ANdroid蓝牙设备搜索.配对 Android 图片水印框架,支持隐形数字水印 android3D旋转 ...

  10. android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码

    Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...