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博客 ...
随机推荐
- NGUI如何创建自己的精灵图集
说实话其实很简单,但是在不知道的情况下真的不好弄啊. 1. 选择你要制作精灵图集的图片,可以选择多张 2. 提倡使用快捷键Alt + Shift + M 会有如下窗口弹出,也可以NGUI --> ...
- cloudera manager 及CDH卸载
记录用户数据路径 删除用户数据 中列出的用户数据路径 /var/lib/flume-ng /var/lib/hadoop* /var/lib/hue /var/lib/navigator /var/l ...
- setup.s
INITSEG = 0x9000 ! we move boot here - out of the way ! 原来 bootsect 所处的段. ! ok, the read went well s ...
- 计算N的阶层
int factorial(int n) { int i, result; ; i <= n; i++) result *= i; return result; } int factorial2 ...
- window2008 64位系统没有office组件问题分析及解决
服务器是windows server2008 64位系统, 我的系统需要用到Microsoft.Office.Interop.Excel组件 在上传Excel单据遇到错误:检索 COM 类工厂中 CL ...
- poj1848 Tree
.....是我多想了. 我想开f[][0~3],看到百度上的题解都是[0~2]的,我就改了 方程不是特别难想.. f代表最小代价 f[i][0]是子树有环过i f[i][1]是子树除了i都成环了 f[ ...
- SQL Server Cpu 100% 的常见原因及优化
SQL Server Cpu 100% 的情况并不太常见,一般引起 SQL Server 产生性能问题的,都是 阻塞.连接数.IO 磁盘等.所以,一般SQL Server 的使用率都是比较低的.但是, ...
- Android实例-消息框(XE8+小米2)
方法一支持. 方法二与方法三都是三方单元,功能相同. 方法4与方法5报错,提示平台不支持. 第三方单元一: unit Android.JNI.Toast; // Java bridge class i ...
- A Tour of Go Exercise: Slices
Implement Pic. It should return a slice of length dy, each element of which is a slice of dx 8-bit u ...
- linux大于2T的磁盘使用GPT分区方式
MBR(Master Boot Record)(主引导记录)和GPT(GUID Partition Table)(GUID意为全局唯一标识符)是在磁盘上存储分区信息的两种不同方式 对于传统的MBR分区 ...