1.Handler默认情况下与主线程处于同一线程

public class MainActivity extends Activity {

    private Button startButton = null;
private Button endButton = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); startButton = (Button) findViewById(R.id.startButton);
endButton = (Button) findViewById(R.id.endButton); startButton.setOnClickListener(new StartButtonListener());
endButton.setOnClickListener(new EndButtonListener()); /*
* if (savedInstanceState == null) {
* getSupportFragmentManager().beginTransaction() .add(R.id.container,
* new PlaceholderFragment()).commit(); }
*/
} class StartButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
System.out.println(Thread.currentThread().getId() + " Start");
handler.post(updateThread);
}
} class EndButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
System.out.println(Thread.currentThread().getId() + " End");
handler.removeCallbacks(updateThread);
}
} Handler handler = new Handler();
Runnable updateThread = new Runnable() {
@Override
public void run() {
System.out
.println(Thread.currentThread().getId() + " UpdateThread");
handler.postDelayed(updateThread, 3000);
}
};

2.通过Handler实现进度条

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context="com.example.mars_1200_progressbarhandler.MainActivity"
tools:ignore="MergeRootFrame" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="hello" /> <ProgressBar
android:id="@+id/bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:visibility="gone" /> <Button
android:id="@+id/startButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="start" /> </LinearLayout>
public class MainActivity extends Activity {

    ProgressBar bar = null;
Button startButton = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); System.out.println("主线程ID:"+Thread.currentThread().getId());
bar = (ProgressBar) findViewById(R.id.bar);
startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new ButtonListener());
/*
* if (savedInstanceState == null) {
* getSupportFragmentManager().beginTransaction() .add(R.id.container,
* new PlaceholderFragment()).commit(); }
*/
} class ButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
}
} //使用匿名内部类
Handler updateBarHandler = new Handler() {
//可传递参数
@Override
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}
}; //线程类,该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable() {
int i = 0;
@Override
public void run() {
System.out.println("Begin Thread");
System.out.println("Handler线程ID:"+Thread.currentThread().getId());
i = i + 10;
//得到一个消息,Message类是有Android操作系统提供的
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个
//成员变量传递值,优点是消耗性能小
msg.arg1 = i;
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
updateBarHandler.sendMessage(msg);
if (i >= 100) {
updateBarHandler.removeCallbacks(updateThread);
}
}
};

3.Handler通过post执行Runnable(还是与主线程处于同一线程)

public class MainActivity extends Activity {
private Handler handler = new Handler(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//handler线程和主线程在同一线程
handler.post(r);
/*Thread t=new Thread(r);
t.start();*/ System.out.println("activity-->" + Thread.currentThread().getId());
System.out.println("activityname-->" + Thread.currentThread().getId());
/*
* if (savedInstanceState == null) {
* getSupportFragmentManager().beginTransaction() .add(R.id.container,
* new PlaceholderFragment()).commit(); }
*/
} Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("handler-->" + Thread.currentThread().getId());
System.out.println("handlername-->"
+ Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
};

4.通过HandlerThread执行线程,并可通过Bundle传递参数

public class MainActivity02 extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity02); System.out.println(Thread.currentThread().getId());
//生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android提供
HandlerThread handlerThread=new HandlerThread("handler_Thread");
handlerThread.start();
MyHandler myHandler=new MyHandler(handlerThread.getLooper());
Message msg=myHandler.obtainMessage();
msg.obj="abc";//通过obj存储数据
Bundle b=new Bundle();
b.putInt("age", 20);
b.putString("name", "Jhon");
msg.setData(b);//通过Bundle存储数据
msg.sendToTarget();//将msg发送到目标对象,所谓的目标对象就是生成该msg的Handler
/*if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}*/
} class MyHandler extends Handler{
public MyHandler(){ }
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg){
System.out.println(msg.obj);
Bundle b=msg.getData();
System.out.println(b.getInt("age"));
System.out.println(b.getString("name"));
System.out.println("handleMessage:"+Thread.currentThread().getId());
}
}

Android之Handler的更多相关文章

  1. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  2. Android 测试Handler的基本使用

    package com.sherlock.app_handler; import java.io.ByteArrayOutputStream; import java.io.InputStream; ...

  3. Android中Handler 、Thread和Runnable之间的关系

    在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...

  4. Android之Handler,举例说明如何更新UI

    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...

  5. Android之Handler用法总结(1)

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  6. Android之Handler用法总结

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  7. 【Android】Handler使用入门

    本讲内容:Handler使用入门 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上 ...

  8. Android的Handler与Activity线程同步

    假设这里有同一个Runnable对象r. 可能采用的方法有: 第一种: handler.post(r); 实际上这种方法并没有调用线程someThread的start方法,而是直接调用了Runaabl ...

  9. 【Android】Handler的应用(三):从服务器端分页加载更新ListView

    在前面两节中,我们了解了如何从服务器中加载JSON数据. 现在,我们将把服务器中的JSON数据加载更新到ListView. 并且,结合之前博文的  “动态追加分页ListView数据”的相关知识,实现 ...

  10. Android之Handler探索

    Handler背景理解: Handler被最多的使用在了更新UI线程中,但是,这个方法具体是什么样的呢?我在这篇博文中先领着大家认识一下什么是handler以及它是怎么样使用在程序中,起着什么样的作用 ...

随机推荐

  1. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  2. 在CentOS里使用MySQL Connector/C++

    操作系统版本:CentOS6 64位 1,安装boost库.因为MySQL Connector/C++使用了boost库,所以必须先安装boost库,我们才能使用MySQL Connector/C++ ...

  3. Lua5.1基本函数库介绍

    Lua5.1基本函数库介绍assert (v [, message])功能:相当于C的断言,参数:v:当表达式v为nil或false将触发错误,message:发生错误时返回的信息,默认为" ...

  4. Dtrace for Linux 2016

    http://www.brendangregg.com/blog/2016-10-27/dtrace-for-linux-2016.html

  5. android 二维码扫描

    了解二维码这个东西还是从微信 中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候, 老板说要加上二维码扫描功 ...

  6. dubbo Linux 解决:nc: command not found

    出现该情况有两种可能: (1)没有配置nc命令的环境变量: (2)该系统没有安装nc命令: 我查看了一下在/usr/bin目录中并没有nc命令,所以我可以认为出现该情况的原因是第二种情况 下载安装 下 ...

  7. Long 陷阱

    String str = "10"; System.out.print(Long.getLong(str)); System.out.print(Long.valueOf(str) ...

  8. DBA日常SQL之查询数据库运行状况

    ,) Day, ,),,)) H00, ,),,)) H01, ,),,)) H02, ,),,)) H03, ,),,)) H04, ,),,)) H05, ,),,)) H06, ,),,)) H ...

  9. DW(二):SqlServer PDW

    当微软发布第一个SQL Server并行数据仓库R2时(SQL ServerParallel Data Warehouse,即PDW),已正式将产品的名称修改为分析服务平台(APS),但在一些非正式场 ...

  10. [转][工地][存]Oracle触发器死锁问题解决

    摘自http://blog.itpub.net/12932950/viewspace-607691/ 这两天一直在因为系统初期设计原因导致的一个触发器问题.问题如下:有表T,有客户编号.账户编号及地址 ...