andorid handler 消息传递机制
16lz
2022-07-09
当一个程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件、用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程又被称为UI线程。
出于性能优化考虑,Android的UI操作不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一个简单的原则:只允许UI线程修改Activity里的UI组件,试图启动一个新线程并刷新UI是不允许的。那么如何让新线程可以刷新UI呢?为了解决这个问题,Android引入了Handler来处理解决这个问题。
Handler类的主要作用有两个:
- 在新启动的线程中发送消息
- 在主线程中获取、处理消息
package com.qicaiz.handlertest;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity{TextView showTextView;Button addButton;MyHandler myHandler;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);showTextView = (TextView)findViewById(R.id.showTextView);addButton = (Button)findViewById(R.id.addButton); //在主线程中加入myHandler,当收到消息时会回调handleMessage(Message msg)方法myHandler = new MyHandler();addButton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View arg0){// TODO Auto-generated method stuMyThread myThread = new MyThread();new Thread(myThread).start();}});} //定义一个新线程class MyThread implements Runnable{@Overridepublic void run(){// TODO Auto-generated method stubtry{Thread.sleep(10000);}catch(InterruptedException e){e.printStackTrace();}Message msg = new Message();Bundle bundle = new Bundle();bundle.putString("add", "更新UI");msg.setData(bundle);myHandler.sendMessage(msg); //myHandler在新启动的线程中发送消息}}//定义MyHandler 继承Handler并重写handleMessage(Message msg)方法class MyHandler extends Handler{ //必须重写的方法@Overridepublic void handleMessage(Message msg){// TODO Auto-generated method stubsuper.handleMessage(msg);Bundle bundle = msg.getData();String str = bundle.getString("add"); //当收到消息时,刷新UI showTextView.setText(str);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
更多相关文章
- 浅析Android中的消息机制-解决:Only the original thread that cr
- Android异步消息机制之Handler
- Android的Handler机制详解3_Looper.looper()不会卡死主线程
- Android之Handler用法总结
- Android开发之消息处理机制(一)——Handler
- Android异步加载图像小结 (含线程池,缓存方法)
- [android]在上下文菜单的选中事件中获取列表选中的元素
- android 面试题集
- android 多点触控