xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.handler.MainActivity" >
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start"
android:textSize="20sp"/> </LinearLayout>

源代码:

main1:

package com.example.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
/**
* Handler:安卓提供的异步线程处理方式
*
* Handler的使用
* 创建一个Handler对象
* 调用Handler的post方法,将要执行的线程对象添加到队列当中
* 将要执行的操作写在线程对象当中
* 在Run方法内部执行postDelayed或者post方法实现循环
*
*分析:调用post方法,将要执行的线程对象或消息对象添加到队列当中,然后该方法return,
* Handler中HanderMessage负责接收消息队列中的消息,
* 从而实现异步处理,互不影响
*/
/**
* 例程:
* 利用Handler处理一个进度条
* @author Administrator
*
*/
public class MainActivity extends Activity implements OnClickListener,Runnable { private Button button;
private ProgressBar progressBar ;
private Thread thread;
private int i = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
button.setOnClickListener(this);
thread = new Thread(this);
thread.start(); } @Override
public void onClick(View v) {
// TODO Auto-generated method stub
progressBar.setVisibility(i);
handler.post(thread);//将线程对象加入到线程对象当中
}
//使用匿名内部类来复写Handler当中的handlerMessage方法
Handler handler = new Handler(){
//接收消息队列中的消息
public void handleMessage(Message msg) {
progressBar.setVisibility(msg.arg1);
handler.post(thread);
System.out.println(handler+"....."+Thread.currentThread().getName());
};
};
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Thread.........."+Thread.currentThread().getName());
i = i+10;
//得到一个消息对象,Message类是由安卓操作系统提供
Message msg = handler.obtainMessage();
//将msg对象的arg1参数设置为i,用arg1和arg2成员变量传递消息,优点是新系统性能消耗较少
msg.arg1 = i;
try {
//设置当前线程休眠1S
thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将消息对象加入到消息队列中
handler.sendMessage(msg);
if(i==100){
//在Handler中移除当前线程
handler.removeCallbacks(thread);
} } }

main2:

package com.example.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
/**
* 为了避免启动一个活动处理事件的时间过长导致该活动没有响应,一般我们处理数据量比较大的数据时,会将其分别放置在几个线程里面,实现异步处理数据
* @author Administrator
*
*/
public class MainActivity2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
System.out.println("activity-->"+Thread.currentThread().getName());
//生成了一个handlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由安卓应用程序框架提供
//looper会循环从队列中取出消息
HandlerThread handlerThread = new HandlerThread("handler_thread");
//在使用handlerThread.getLooper()方法之前必须先开启线程
handlerThread.start();
//将Handler通过getLooper方法绑定在了调用Looper的线程上
MyHandler handler = new MyHandler(handlerThread.getLooper());
Message msg = handler.obtainMessage();
Bundle data = new Bundle();
data.putString("name", "zhangsan");
data.putInt("age", 20);
msg.obj = "abc";
msg.setData(data);
//将msg发送到目标对象,所谓的目标对象就是生成该msg对象的handler对象
msg.sendToTarget();
}
}
class MyHandler extends Handler{
public MyHandler(){ }
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
String obj = (String) msg.obj;
Bundle data = msg.getData();
String name = data.getString("name");
int age = data.getInt("age");
System.out.println(name+"::"+age);
System.out.println("handler-->"+Thread.currentThread().getName());
}
}

Android_Handler的更多相关文章

  1. android_handler(三)

    这篇记录 android 消息机制中,MainThread 向 WorkThread 发送消息.( MainThread → WorkThread ) 步骤: 1.准备looper对象 2.在子线程中 ...

  2. android_handler(二)

    这篇记录 android 消息机制中.WorkThread 模拟向网络訪问数据,获得数据后,返回 message 发送给 MainThread ,并改动 TextView 的 text 的这种一个步骤 ...

  3. android_handler(一)

    仅仅是一个简单的handler的样例,目的就是对handler有一个初步的接触. 在layout上加入一个button,点击按钮,然后打印出利用handler传送的数据.(都是执行在mainthrea ...

  4. Android多线程通信机制

    掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...

  5. Android消息机制:Looper,MessageQueue,Message与handler

    Android消息机制好多人都讲过,但是自己去翻源码的时候才能明白. 今天试着讲一下,因为目标是讲清楚整体逻辑,所以不追究细节. Message是消息机制的核心,所以从Message讲起. 1.Mes ...

  6. 【转】Android--多线程之Handler--不错

    原文网址:http://www.cnblogs.com/plokmju/p/android_handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了 ...

  7. Android-消息处理学习总结(Handler,Looper)

    参考资料: http://www.cnblogs.com/qlky/p/5657924.html http://blog.csdn.net/guolin_blog/article/details/99 ...

  8. [转]Android--多线程之Handler

    原文:http://www.cnblogs.com/plokmju/p/android_Handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决 ...

  9. ot

    https://blog.csdn.net/notice520/article/details/8135600 | android中的跨进程通信的实现(一)——远程调用过程和aidl - CSDN博客 ...

随机推荐

  1. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (五) 如何让窗体记录登录状态Session

    在写自动化测试的Node.js脚本时, 时常需要测试所写的case, 可能都需要去重新登录一遍,这将相当的耗时, 好在Selenium都借了Session的机制, 如果在最初的浏览器没有关闭的情况下, ...

  2. 安装mysql-5.7.9-winx64

    1.mysql-5.7.9-winx64.zip下载 官方网站下载地址:http://dev.mysql.com/downloads/mysql/5.7.html 2.解压到D:\MySqlDataB ...

  3. leetcode@ [174] Dungeon Game (Dynamic Programming)

    https://leetcode.com/problems/dungeon-game/ The demons had captured the princess (P) and imprisoned ...

  4. Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

    Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...

  5. Android实例-设置消息提醒(XE8+小米2)

    相关资料: 1.官网实例:http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Using_the_Notification ...

  6. Umbraco Forms 使Rendering Forms scripts 在不同的template中

    具体请参考 https://our.umbraco.org/documentation/products/umbracoforms/developer/Rendering-Scripts/ 转载 ht ...

  7. 新建数据库,然后使用SQL语句创建表、存储过程、用户说明

    需要在数据库的安全性,用户那里为用户设置一下权限

  8. Redis集群的使用测试(Jedis客户端的使用)

    Redis集群的使用测试(Jedis客户端的使用)1.Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持.https://github.com/xetorthio ...

  9. Java多线程——Semaphore信号灯

    Semaphore可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数(即允许n个任务同时访问这个资源),例如,实现一个文件允许的并发访问数. Sem ...

  10. openstack系列阅读目录

    一 keystone系列 keystone基础 网关协议cgi,fastcgi,wsgi,uwsgi keystone源码分析 keystone部署及使用 keystone客户端工作介绍 二 glan ...