这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
demo:下载地址。
运行截图:
源码:
- package fk.androiddemo_005;
- //工作线程不能直接修改主线程的控件,只能通过handler传递信息
- //对于以上,progressBar控件除外
- //通过handler-looper可以实现在各个线程之间传递信息
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.ProgressBar;
- import android.widget.TextView;
- public class MainActivity extends AppCompatActivity implements View.OnClickListener{
- Button but;
- TextView text;
- ProgressBar proBar;
- MyHandler handler;//定义handler
- Handler handler2;
- Message msg;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- but=(Button)findViewById(R.id.but);
- but.setOnClickListener(this);
- text=(TextView)findViewById(R.id.text);
- proBar=(ProgressBar)findViewById(R.id.proBar);
- handler=new MyHandler();//在主线程中实现handler,就会在主线程中用Looper处理其msg
- new MyAcceptThread().start();//开启接收信息线程(先开,因为handler2是在这个线程里实现的)
- }
- @Override
- public void onClick(View v) {
- new MySendThread().start();//开启发送信息线程
- }
- // 发送信息的线程类
- class MySendThread extends Thread{
- public void run(){
- int i=0;
- while(i!=10){
- Bundle bundle=new Bundle();
- bundle.putString("num","第"+i+"次");//bundle中也可以放序列化或包裹化的类对象数据
- msg=handler.obtainMessage();//每发送一次都要重新获取
- msg.setData(bundle);
- handler.sendMessage(msg);//用handler向主线程发送信息
- msg=handler2.obtainMessage();
- msg.what=i;
- handler2.sendMessage(msg);//用handler2向myAcceptThread线程发送信息
- //休眠3秒,需要异常处理
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- i++;
- }
- }
- }
- //接收信息的线程类
- class MyAcceptThread extends Thread{
- public void run(){
- Looper.prepare();//准备Looper对象
- //在分线程中实现handler2,就会在分线程中处理其msg
- handler2=new Handler(){//这是用匿名内部类生成一个handler对象
- public void handleMessage(Message msg) {
- proBar.setProgress(msg.what);
- }
- };
- //调用Looper的loop方法后,Looper对象将不断从消息队列中取出消息对象并交给handleMessage处理
- //没有消息时该线程会阻塞
- Looper.loop();
- }
- }
- //自定义handler类
- class MyHandler extends Handler{
- @Override
- //接收别的线程的信息并处理
- public void handleMessage(Message msg) {
- Bundle bundle=msg.getData();
- text.setText(bundle.get("num").toString());
- }
- }
- }