您的位置:首页 > 其它

线程与Handler(1)

2014-05-07 14:09 99 查看
在Java中,线程有两种实现方式:1、继承Thread类 代表一个线程 ;2、实现Runable接口,代表一个线程体。

在Android当中也是如此。Android中的线程有两种。1、MainThread 主线程又叫UI线程;2、WorkerThread 即除主线程以外的其他线程。

若想利用线程对UI进行控制的话,一般只能通过UI线程,即MainThread(ProgressBar除外),这时对于一些可能会产生阻塞的操作,会导致应用无响应。因此必须把此类操作放置在WorkerThread当中,然而,WorkerThread中是不允许操作UI的。

此时,我们需要用到Handler处理器,使用消息机制来发送消息。

Handler的基本运行原理是Android开发当中最精妙也是最常用的设计。主要分为三个部分:1、Handler(处理器)2、Looper(循环器)3、MessageQueue(消息队列)

下面将用例子来说明。

activity_main.xml

<RelativeLayout 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"
tools:context="${packageName}.${activityClass}" >

<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button" />

</RelativeLayout>


MainActivity.java

package com.wyb.s02_e06_handler01;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

private Button button;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

button = (Button)findViewById(R.id.button);
button.setOnClickListener(new ButtonListener());
handler = new FirstHandler();

}

class ButtonListener implements OnClickListener{

@Override
public void onClick(View v) {
//当用户点击按钮时,我们创建一个Message对象,并用handler发送该对象
Message msg=handler.obtainMessage();
msg.what = 2;
handler.sendMessage(msg);//传到handleMessage方法当中
//上面一行代码将消息对象放置在消息队列中
//1.Looper将会从消息队列中将消息队列取出
//2.Looper将会找到与消息对象相应的Handler对象
//3.Looper将会调用handler对象中的handlMessage(Message msg)方法,用于处理消息对象
}

}

class FirstHandler extends Handler{
//重写handleMessage方法
@Override
public void handleMessage(Message msg){
int what = msg.what;
System.out.println("what : "+what);
}
}

}


运行截图





在主界面放置一个按钮,当用户点击按钮时在控制台中输出Message对象的what的值。

流程如下:

1、定义一个FirstHandler 类继承Handler类,并重写handleMessage(Message msg)方法;

2、创建一个FirstHandler对象,并向上转型为Handler;

3、当用户点击按钮时,我们创建一个Message对象,并用handler发送该对象 Message msg=handler.obtainMessage();

4、设置msg中what的值为2;msg.what = 2;

5、将msg对象传入handleMessage方法当中 即将消息对象放置在消息队列中handler.sendMessage(msg);

6、Looper将会从消息队列中将消息队列取出

7、Looper将会找到与消息对象相应的Handler对象

8、Looper将会调用handler对象中的handleMessage(Message msg)方法,用于处理消息对象

9、调用handleMessage(Message msg)方法,执行System.out.println("what : "+what),在控制台中输出what的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: