安卓中一个程序跑起来叫进程,进程中至少有一个主线程。主线程用于处理用户的触摸操作和将触摸操作事件分发给响应的控件。如果进行消耗时间操作,下载,磁盘读取文件,不润许在主线程操作,只能在工作线程操作。主线程向工作线程发送消息和数据,工作线程也会时时反馈给主线程。线程通信:多个线程互相收发消息和数据。
安卓规定只有主线程才能修改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 线程通信的更多相关文章

  1. Android中线程通信的方式

    Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...

  2. android 37 线程通信Looper

    安卓程序的主线程也叫UI线程. 工作线程和主线程的差别:安卓主线程已经调用了Looper.prepare()方法了,已经有一个MessageQueue对象了,所以才可以在工作线程用Handler发消息 ...

  3. Android线程管理(一)——线程通信

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  4. Android中线程间通信原理分析:Looper,MessageQueue,Handler

    自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么 ...

  5. Android笔记(六):线程及线程通信

    线程 由于Android的Activity中默认所有代码都在主线程(UI线程)中执行,如果在这里面执行耗时任务(例如下载),界面就会无反应且不可操作,直到耗时任务执行完毕. 如果想在执行耗时任务的同时 ...

  6. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  7. Android UI线程和非UI线程

    Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...

  8. android 进程/线程管理(一)----消息机制的框架

    一:android 进程和线程 进程是程序运行的一个实例.android通过4大主件,弱化了进程的概念,尤其是在app层面,基本不需要关系进程间的通信等问题. 但是程序的本质没有变,尤其是多任务系统, ...

  9. Android和WCF通信 - 大数据压缩后传输

    Android和WCF通信 - 大数据压缩后传输 本帖来源:http://www.cnblogs.com/lykbk/archive/2013/08/15/3259045.html 最近一直在优化项目 ...

随机推荐

  1. chmod 命令

    来源网址: http://www.2cto.com/os/201205/130236.html http://www.cnblogs.com/younes/archive/2009/11/20/160 ...

  2. ios8新特性widget开发-b

    os8发布已经有一段时间了,伴随着ios8同时也出现了许多新的特性,ios系统将会越来越开放,这是好事.其中一个新特性就是在下拉通知栏里加入了个性的widget,开发者可以自己定义widget的样式内 ...

  3. 用C++实现绘制标尺的方法,使用了递归

    在这个例子当中将使用递归来实现一个打印标尺刻度的方法.首先是递归,函数调用其本身就叫递归,在需要将一项工作不断分为两项较小的.类似的工作时,递归非常有用,递归的方法被称为分而治之策略. 下面是一个wi ...

  4. Octopress 之 Mac 版环境配置

    前提条件: 1.安装了 Git2.用 rbenv 或 RVM 安装了 Ruby 1.9.3 以上版本3.安装了 ExecJS 的一种支持 JavaScript 运行环境 一.安装 Octopress ...

  5. SKProductsRequest ios 7不调用delegate

    在iOS7中,内购只能在真机上才会调用 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProdu ...

  6. lc面试准备:Implement Stack using Queues

    1 题目 Implement the following operations of a stack using queues. push(x) -- Push element x onto stac ...

  7. java.sql.SQLException: Can not issue executeUpdate() for SELECTs

    未处理的多个select语句 解决方法就是:查看有没有用了同一个连接来处理多个SQL语句!

  8. 5个最佳免费Linux杀毒软件

    5个最佳免费Linux杀毒软件 Linux的防病毒软件,开玩笑吧?Linux不是很安全吗?很多Linux新手都这样认为,看到标题不要犹豫,读完全文你就会从中找到答案. 首先,Linux比其它操作系统更 ...

  9. 【转】linux(Ubuntu)配置svn仓库,搭建svn服务器

    原文网址:http://blog.1v2d.com/322.html 在家里搞了好久,终于搞出来,并且在线上已经成功搭建成功,在这感谢一个博主的文章,本篇文章也主要是转载他的内容,写的非常好,而且非常 ...

  10. 【转】模拟器上安装googleplay apk

    原文网址:http://blog.sina.com.cn/s/blog_9fc2ff230101gv57.html 1.进入到sdk\android-sdk-windows\tools>目录下: ...