Android_Handler
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的更多相关文章
- android_handler(三)
这篇记录 android 消息机制中,MainThread 向 WorkThread 发送消息.( MainThread → WorkThread ) 步骤: 1.准备looper对象 2.在子线程中 ...
- android_handler(二)
这篇记录 android 消息机制中.WorkThread 模拟向网络訪问数据,获得数据后,返回 message 发送给 MainThread ,并改动 TextView 的 text 的这种一个步骤 ...
- android_handler(一)
仅仅是一个简单的handler的样例,目的就是对handler有一个初步的接触. 在layout上加入一个button,点击按钮,然后打印出利用handler传送的数据.(都是执行在mainthrea ...
- Android多线程通信机制
掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...
- Android消息机制:Looper,MessageQueue,Message与handler
Android消息机制好多人都讲过,但是自己去翻源码的时候才能明白. 今天试着讲一下,因为目标是讲清楚整体逻辑,所以不追究细节. Message是消息机制的核心,所以从Message讲起. 1.Mes ...
- 【转】Android--多线程之Handler--不错
原文网址:http://www.cnblogs.com/plokmju/p/android_handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了 ...
- Android-消息处理学习总结(Handler,Looper)
参考资料: http://www.cnblogs.com/qlky/p/5657924.html http://blog.csdn.net/guolin_blog/article/details/99 ...
- [转]Android--多线程之Handler
原文:http://www.cnblogs.com/plokmju/p/android_Handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决 ...
- ot
https://blog.csdn.net/notice520/article/details/8135600 | android中的跨进程通信的实现(一)——远程调用过程和aidl - CSDN博客 ...
随机推荐
- 数学(扩展欧几里得算法):HDU 5114 Collision
Matt is playing a naive computer game with his deeply loved pure girl. The playground is a rectangle ...
- Servlet3.0学习总结(一)——使用注解标注Servlet
一.Servlet3.0介绍 Servlet3.0是Java EE6规范的一部分,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述 ...
- WPF 中资源路径的问题
WPF 中资源路径的问题 1. 引用当前工程的资源(注意xxxx.png的build action 应设置为Resource 或Embedded Resource) <ImageBrush Im ...
- HDU4289 Control 最大流
经典题,求去掉若干个点,使得两个点不在连通,总价值最少 所以拆点最小割,除了拆点边,流量都为无穷,拆点边是流量为价值 #include <iostream> #include <cs ...
- Datatable转成Json方式两则
1, Asp.net C# 使用Newtonsoft.Json 实现DataTable转Json格式数据 1.这里下载:http://www.newtonsoft.com/products/json/ ...
- [RQNOJ313]波浪数
题目描述 波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数, ...
- 《GettingThingsDone》--GTD学习笔记(一)-GTD理论
利用春节假期阅读了<Getting Things Done>一书,下文整理了下阅读过程中做的读书笔记和心得. ==GTD理论== 一. 目的: 1. 收集需要处理的事情把它置于一个脱离大脑 ...
- 在win64位,python64位2.7版本中安装pyHook
今天看了一篇博文说的是利用pyhook监听键盘鼠标事件(感兴趣的可以看博客园中相关文章),文章中使用的pyHook模块的官方下载地址是:http://sourceforge.net/projects/ ...
- Spark系列(三)SparkContext分析
SparkContext初始化流程图 其它说明: 在createTaskScheduler会根据不同的提交模式创建backend对象(如本地模式为LocalBackend). 在SparkDeploy ...
- Linux Shell 数学运算
Linux Shell 数学运算 在Linux中直接使用数学运算符进行数学运算往往得不到我们想要的计算结果.要在Shell中进行数学运算,我们需要借助点小手段.目前,Linux Shell中进行数学运 ...