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. 1、WWDC2014 详解OSX/iOS8/Swift语言

    OS X 10新特性 1.系统图标扁平化. 2.系统菜单栏可定制. 3.新的通知中心. 4.新的Spotlight. 5.新的iCloud Drive,新增文档同步功能(学Windows). 6.新的 ...

  2. 利用doxygen提高源代码阅读效率

    阅读开源项目的源代码是提高自己编程能力的好方法,而有一个好的源代码阅读工具无疑能够让你在阅读源代码时事半功倍.之前找过不少源代码阅读工具,像SourceInsight.sourcenav.scitoo ...

  3. 打造无DLL版穿透防火墙Downloader

    这份代码的思路来自于国外EES组织的Aphex.基本上所有的无DLL Download都是利用的这种方法.其实也就是用烂了的远程注入法.不过注入的对象不是一个DLL,而是本身的一个过程.下面是代码,由 ...

  4. hdu 5585 Numbers【大数+同余定理】

    Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  5. hdoj 2544 最短路【dijkstra or spfa】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. [Objective-c 基础 - 3.4] protocol

    A.概念 1.用来声明方法(不能声明成员变量) 2.只要某个类遵守了这个协议,相当于拥有了协议中得所有方法的声明 3.属性 (1)@required:默认,要求实现,不实现就会发出警告 (2)@opt ...

  7. LINUX下的简单线程池

    前言 任何一种设计方式的引入都会带来额外的开支,是否使用,取决于能带来多大的好处和能带来多大的坏处,好处与坏处包括程序的性能.代码的可读性.代码的可维护性.程序的开发效率等. 线程池适用场合:任务比较 ...

  8. Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点

    Oracle 中利用闪回查询确定某表在某时间点之后的修改内容: 1.查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMEST ...

  9. ios开发 数据库版本迁移手动更新迭代和自动更新迭代

    数据库版本迁移顾名思义就是在原有的数据库中更新数据库,数据库中的数据保持不变对表的增.删.该.查. 数据持久化存储: plist文件(属性列表) preference(偏好设置) NSKeyedArc ...

  10. iOS开发-控件设置

    一.用户界面控件共有三种基本模式:动态.静态(非动态)和被动 动态:点击它们时会发生事情——通常是出发一段自己编写的时间代码. 被动:仅用于存储用户输入的值,以备后续使用.这些控件不会触发任何操作方法 ...