android 36 线程通信
安卓中一个程序跑起来叫进程,进程中至少有一个主线程。主线程用于处理用户的触摸操作和将触摸操作事件分发给响应的控件。如果进行消耗时间操作,下载,磁盘读取文件,不润许在主线程操作,只能在工作线程操作。主线程向工作线程发送消息和数据,工作线程也会时时反馈给主线程。线程通信:多个线程互相收发消息和数据。
安卓规定只有主线程才能修改UI界面和控件(除了进度条可以在工作线程修改),如果工作线程想修改UI界面则只能通知主线程进行修改。
Handler:句柄,手柄,遥控器,操作板。




mainActivity:
package com.sxt.day06_01; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { Handler mHandler;
private static final int DOWNLOADING=1;//下载中,内部类中使用所以用静态类型,
private static final int DOWNLOAD_FINISH=10;//下载完成 ProgressBar mProgressBar;
TextView mtvProgress; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
initHandler();
} private void initHandler() {
//主线程处理消息
mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWNLOADING:
mtvProgress.setText(msg.arg1+"%");
break;
case DOWNLOAD_FINISH:
Toast.makeText(MainActivity.this, "下载完成", 2000).show();
break;
}
}
};
} private void setListener() {
findViewById(R.id.btnStartDownload).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
new Thread(){//创建线程(工作线程)
public void run() {
for(int i=1;i<=100;i++){
SystemClock.sleep(20);
mProgressBar.setProgress(i);//这个控件可以在工作线程修改
//没改变一次发送一个消息,发送100次,发送到Message的队列中,
Message msg=Message.obtain();//静态方法获取message,从线程池中取一个对象,线程池是内存的一个缓冲区域,如果第一次没有Message对象会new一个,使用完以后不会销毁,下次直接从池子中取,线程池最多放10个,
msg.what=DOWNLOADING;//what属性是消息的类型,整型。
msg.arg1=i;//arg1,arg2也是整型,还有一个obj属性是Object类型。
mHandler.sendMessage(msg);//发送消息给主线程,显示百分比
}
//循环完以后发送一个结束的消息
Message msg=Message.obtain();
msg.what=DOWNLOAD_FINISH;
mHandler.sendMessage(msg);
};
}.start();
}
});
} private void initView() {
mProgressBar=(ProgressBar) findViewById(R.id.pb);
mtvProgress=(TextView) findViewById(R.id.tvProgress);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
页面:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <Button
android:id="@+id/btnStartDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始下载" />
<ProgressBar 进度条
android:id="@+id/pb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
android:max="100"/>
<TextView 百分比的数字
android:id="@+id/tvProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="0%"/>
</LinearLayout>
android 36 线程通信的更多相关文章
- Android中线程通信的方式
Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...
- android 37 线程通信Looper
安卓程序的主线程也叫UI线程. 工作线程和主线程的差别:安卓主线程已经调用了Looper.prepare()方法了,已经有一个MessageQueue对象了,所以才可以在工作线程用Handler发消息 ...
- Android线程管理(一)——线程通信
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android中线程间通信原理分析:Looper,MessageQueue,Handler
自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么 ...
- Android笔记(六):线程及线程通信
线程 由于Android的Activity中默认所有代码都在主线程(UI线程)中执行,如果在这里面执行耗时任务(例如下载),界面就会无反应且不可操作,直到耗时任务执行完毕. 如果想在执行耗时任务的同时 ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
- Android UI线程和非UI线程
Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...
- android 进程/线程管理(一)----消息机制的框架
一:android 进程和线程 进程是程序运行的一个实例.android通过4大主件,弱化了进程的概念,尤其是在app层面,基本不需要关系进程间的通信等问题. 但是程序的本质没有变,尤其是多任务系统, ...
- Android和WCF通信 - 大数据压缩后传输
Android和WCF通信 - 大数据压缩后传输 本帖来源:http://www.cnblogs.com/lykbk/archive/2013/08/15/3259045.html 最近一直在优化项目 ...
随机推荐
- jquery 学习日记之选择器
看完Jquery选择器的教程视频后,对jquery的选择器有一定的认识和了解,现整理一下知识: 一.jquery基本选择器,这类比较简单,一笔带过. #id 选择器,是选择 匹配id值中的第一个元素 ...
- 关于【键鼠<局域网>共享软件:synergy】install
Installation 另外,本人在centos6.5环境下作为server运行时,遇到一个问题,synergy1.5随着系统升级居然变成了1.3X,所以如果遇到类似问题,请您先用 rpm -qa ...
- Find your present (2) (位异或)
Problem Description In the new year party, everybody will get a "special present".Now it's ...
- html5 中的 css样式单 的 两种调用方式的区别
在 html5 中 使用 css 样式单的方式 有4种: 1.链接外部样式文件:将样式文件 彻底与 html 文档分离,样式文件需要额外引入,这种情况下 一批样式 可以控制多份文档.对于好多文件都共有 ...
- matlab常用小函数(一)
(第1维为对每一列操作,第2维维对每一行操作) sum 求和操作 max 求最大值操作 sum:求和操作 sum(A):矩阵A按列向求和(每一列求和),结果为一个行向量 sum(A,2):矩阵A按行向 ...
- Coursera《machine learning》--(6)逻辑回归
六 逻辑回归(Logistic Regression:LR) 逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就是由于这个逻辑函数,使得 ...
- LightOj_1265 Island of Survival
题目链接 题意: 在孤岛生存, 孤岛上有t头老虎,d头鹿, 每天会出现随机出现两只生物(包括你自己), 如果出现了一只老虎,那么你将被吃掉, 如果两只老虎, 则两只老虎会同归于尽,其他情况你都将生存下 ...
- [SQL Server]一次执行资料夹内的.sql 指令码
原文:[SQL Server]一次执行资料夹内的.sql 指令码 初始资料库时,我们Developers们会准备很多.sql指令码来建立资料表.检视甚至初始资料,那麽要怎麽一次执行资料夹内的*.sql ...
- wcf托管在IIS上,提示未能加载
“/”应用程序中的服务器错误. 未能加载文件或程序集“ZBMYunCoreLib.DLL”或它的某一个依赖项.找不到指定的模块. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪 ...
- MongoDB 权限管理 用户名和密码的操作
在刚安装完毕的时候MongoDB都默认有一个admin数据库,而admin.system.users中将会保存比在其它数据库中设置的用户权限更大的用户信息. 当admin.system.users中 ...