android Handler Thread Looper 结合用法

在主UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可,然后公告handler来发送消息,处理消息。

程序猿自己启动的子线程,程序猿必须自己创建一个Looper对象,并且启动它,创建looper对象调用他的prepare()方法即可。该方法

保证每一个线程最多只有一个Lopper对象

调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象的时候,他的构造器会创建一个与之配套的MessageQueue

调用Looper的loop()方法启动Lopper.

如下为用新线程计算质数例子

public class MainActivity extends Activity {

private EditText et;

private Button bt;

private TextView tv;

static final String UPPER_NUM = "upper";

calThread calthread;

class calThread extends Thread {

public Handler mhandler;

@Override

public void run() {

Looper.prepare();

mhandler = new Handler() {

@Override

public void handleMessage(Message msg) {

if (msg.what == 0x123) {

int upper = msg.getData().getInt(UPPER_NUM);

List<Integer> nums = new ArrayList<Integer>();

outer: for (int i = 2; i <= upper; i++) {

for (int j = 2; j <= Math.sqrt(i); j++) {

if (i != 2 && i % j == 0) {

continue outer;

}

}

nums.add(i);

}

Toast.makeText(MainActivity.this, nums.toString(),

Toast.LENGTH_SHORT).show();

}

}

};

Looper.loop();

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et = (EditText) findViewById(R.id.editText1);

bt = (Button) findViewById(R.id.button1);

tv = (TextView) findViewById(R.id.textView1);

calthread = new calThread();

calthread.start();

bt.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

Message ms = new Message();

ms.what = 0x123;

Bundle bundle = new Bundle();

bundle.putInt(UPPER_NUM, Integer.parseInt(et.getText().toString()));

ms.setData(bundle);

calthread.mhandler.sendMessage(ms);

}

});

}

}



时间: 2024-11-13 06:31:37

android Handler Thread Looper 结合用法的相关文章

Android Handler,Looper,Message

做一个简单的关于Handler,Looper,Message的小演示,代码主界面一个Button按钮,点击发送消息(累计)给线程的Looper循环,然后在LogCat中打印出来: package zhangphil.looper; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; imp

android handler、looper、message、messageQueue、

一:handler,looper,message,messagequeue,thread handler: 消息处理着,负责Message消息的发送(handler.sendMessage(....))以及处理消息,对于handler处理消息则需要实现handlerMessage(Message msg)该方法,通过该方法处理特定的消息,例如ui的更细 looper:消息泵,用来从messageQueue中抽取消息,所以一个looper对应一个messageQueue: message:消息,m

安卓线程相关 HandlerThread Handler Thread Looper Message Runnable

本文由PurpleSword(jzj1993)原创,转载请注明 原文网址 http://blog.csdn.net/jzj1993 安卓主线程(UI线程)是线程不安全的:对UI控件的操作都应在主线程中完成:UI线程不应执行耗时操作,以免程序不响应(即ANR异常) 实现新线程的常用方法(注意要调用start方法启动新线程而不是run方法): 一.定义类,实现Runnable接口 class MyRunnable implements Runnable { /** * 实现接口的run方法 */ @

Android+Handler+Thread 那些事儿

前言,才开始学安卓十几天,不料被线程挡住了前进的步伐,因为之前操作系统课程并没有认真听老师讲课,导致现在理解这些抽象的东西有些小困难.没关系,苦学之路,总会碰到坎坷,这里也给那些迷失在Android之路的小生们鼓励,每天多学一点,就是给自己最大的馈赠. 1.可能有很多人看到这个线程就有点慌乱了手脚,这个名词有点高大上,我是这么觉得的,无独有偶,我觉得同步,异步也是一样,如果从一个刚入门Android的同学,可能会很难理解,遇到这些问题就想跳过,我就是这样的人. 2.对于Android开发来说,U

Android Handler消息传递机制详解

1.为什么要用Handler 出于性能优化的考虑,Android UI操作并不是线程安全,如果有多个线程并发操作UI组件,可能导致线程安全问题.可以设想下,如果在一个Activity中有多个线程去更新UI,并且都没有加锁机制,可能会导致什么问题? 界面混乱,如果加锁的话可以避免该问题但又会导致性能下降.因此,Android规定只允许UI线程修改Activity的UI组件.当程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,比如用户

Android handler 报错处理Can&#39;t create handler inside thread that has not called Looper.prepare()

解决方法,在ui线程里面创建handler m_MainActivity.runOnUiThread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub GameBoxUtil.startPay(m_MainActivity,String.valueOf(amount), productName, payCode,orderId,payHandler); }}); Android han

深入理解Android消息处理系统——Looper、Handler、Thread

Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制.实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制. Android通过Looper.Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环). 本文深入介绍一下Android消息处理系统原理. Android系统中Looper负责管理线程的消息队列和消息循环,具体实现请参考Looper的源码. 可以通过Loop.myLooper(

Android中Thread、Handler、Looper、MessageQueue的原理分析

在Android开发当中,Thread.Handler.Looper这几个类是特别常见,在刚开始学习Android的时候对这些类可能并不是很清晰.下面我们就一起从源码的角度剖析一下这几个类的工作原理. Thread 首先是Thread, 我们都知道一个Thread就是一个线程对象,只要在run方法中填写自己的代码然后启动该线程就可以实现多线程操作.例如 : new Thread(){ public void run() { // 耗时的操作 }; }.start(); 我们知道,针对上面的代码中

(八)Android中Handler、Looper、Message、MessageQueue的关系

一.Handler.Looper.Message.MessageQueue类功能简介 1.1 Message 消息类,定义了发送给Handler对象的包含描述和二进制数据对象的消息对象.这个类比较重要的字段: what:消息码用于接收者识别是啥消息,每个Handler对象有自己的命名空间用于消息码,所以不需要担心不同的Handler对象识别消息码冲突.在消息处理中,我们可以根据这个字段的不同的值进行不同的处理. arg1/ arg2:用来存放整型值,开销小 obj:任意的Object类型对象传递