贵阳做网站的大公司,重庆高端网站设计,简述网站栏目管理,wordpress 查看版本总结4个关键概念 1、MessageQueue#xff1a;是一种数据结构#xff0c;见名知义#xff0c;就是一个消息队列#xff0c;存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。 创建一个线程的时候#xff0c;并不会自动创建其MessageQueue。通常使用一个… 总结4个关键概念 1、MessageQueue是一种数据结构见名知义就是一个消息队列存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。 创建一个线程的时候并不会自动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。主线程创建时会创建一 个默认的Looper对象而Looper对象的创建将自动创建一个Message Queue。其他非主线程不会自动创建Looper要需要的时候通过调 用prepare函数来实现。 2、Message消息对象Message Queue中的存放的对象。一个Message Queue中包含多个Message。 Message实例对象的取得通常使用Message类里的静态方法obtain(),该方法有多个重载版本可供选择它的创建并不一定是直接创建一个新的实例 而是先从Message Pool(消息池)中看有没有可用的Message实例存在则直接取出返回这个实例。如果Message Pool中没有可用的Message实例 则才用给定的参数创建一个Message对象。调用removeMessages()时将Message从Message Queue中删除同时放入到Message Pool中。除了上面这 种方式也可以通过Handler对象的obtainMessage()获取一个Message实例。 3、Looper 是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象 和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象 创建一个Looper对象时会同时创建一个MessageQueue对象。除了主线程有默认的Looper其他线程默认是没有MessageQueue对象的所以不能 接受Message。如需要接受自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。 Looper从MessageQueue中取出Message然后交由Handler的handleMessage进行处理。处理完成后调用Message.recycle()将其放入Message Pool中。4、Handler 消息的处理者handler负责将需要传递的信息封装成Message通过调用handler对象的obtainMessage()来实现 将消息传递给MessageQueue这是通过handler对象的sendMessage()来实现的。当Looper对象看到MessageQueue中含有Message就将其广播出去。该handler对象收到该消息后调用相应的handler对象的handleMessage()方法 对其进行处理。二、线程之间的消息如何进行传递 1、主线程给自己发送Message public class MainActivity extends Activity { private Button btnTest; private TextView textView; private Handler handler; Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnTest (Button)this.findViewById(R.id.btn_01); textView (TextView)this.findViewById(R.id.view_01); btnTest.setOnClickListener(new View.OnClickListener() { Override public void onClick(View arg0) { Looper looper Looper.getMainLooper(); //主线程的Looper对象 //这里以主线程的Looper对象创建了handler //所以这个handler发送的Message会被传递给主线程的MessageQueue。 handler new MyHandler(looper); handler.removeMessages(0); //构建Message对象 //第一个参数是自己指定的message代号方便在handler选择性地接收 //第二三个参数没有什么意义 //第四个参数需要封装的对象 Message msg handler.obtainMessage(1,1,1,主线程发消息了); handler.sendMessage(msg); //发送消息 } }); } class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ super.handleMessage(msg); textView.setText(我是主线程的Handler收到了消息(String)msg.obj); } } } 2、其他线程给主线程发送Message public class MainActivity extends Activity { private Button btnTest; private TextView textView; private Handler handler; Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnTest (Button)this.findViewById(R.id.btn_01); textView (TextView)this.findViewById(R.id.view_01); btnTest.setOnClickListener(new View.OnClickListener() { Override public void onClick(View arg0) { //可以看出这里启动了一个线程来操作消息的封装和发送的工作 //这样原来主线程的发送就变成了其他线程的发送简单吧呵呵 new MyThread().start(); } }); } class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ super.handleMessage(msg); textView.setText(我是主线程的Handler收到了消息(String)msg.obj); } } //加了一个线程类 class MyThread extends Thread{ public void run(){ Looper looper Looper.getMainLooper(); //主线程的Looper对象 //这里以主线程的Looper对象创建了handler //所以这个handler发送的Message会被传递给主线程的MessageQueue。 handler new MyHandler(looper); //构建Message对象 //第一个参数是自己指定的message代号方便在handler选择性地接收 //第二三个参数没有什么意义 //第四个参数需要封装的对象 Message msg handler.obtainMessage(1,1,1,其他线程发消息了); handler.sendMessage(msg); //发送消息 } } } 3、主线程给其他线程发送Message public class MainActivity extends Activity { private Button btnTest; private TextView textView; private Handler handler; Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnTest (Button)this.findViewById(R.id.btn_01); textView (TextView)this.findViewById(R.id.view_01); //启动线程 new MyThread().start(); btnTest.setOnClickListener(new View.OnClickListener() { Override public void onClick(View arg0) { //这里handler的实例化在线程中 //线程启动的时候就已经实例化了 Message msg handler.obtainMessage(1,1,1,主线程发送的消息); handler.sendMessage(msg); } }); } class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ super.handleMessage(msg); textView.setText(我是主线程的Handler收到了消息(String)msg.obj); } } class MyThread extends Thread{ public void run(){ Looper.prepare(); //创建该线程的Looper对象用于接收消息 //注意了这里的handler是定义在主线程中的哦呵呵 //前面看到直接使用了handler对象是不是在找在什么地方实例化的呢 //现在看到了吧呵呵开始的时候实例化不了因为该线程的Looper对象 //还不存在呢。现在可以实例化了 //这里Looper.myLooper()获得的就是该线程的Looper对象了 handler new ThreadHandler(Looper.myLooper()); //这个方法有疑惑吗 //其实就是一个循环循环从MessageQueue中取消息。 //不经常去看看你怎么知道你有新消息呢 Looper.loop(); } //定义线程类中的消息处理类 class ThreadHandler extends Handler{ public ThreadHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ //这里对该线程中的MessageQueue中的Message进行处理 //这里我们再返回给主线程一个消息 handler new MyHandler(Looper.getMainLooper()); Message msg2 handler.obtainMessage(1,1,1,子线程收到:(String)msg.obj); handler.sendMessage(msg2); } } } } 4、其他线程给自己发送Message public class MainActivity extends Activity { private Button btnTest; private TextView textView; private Handler handler; Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnTest (Button)this.findViewById(R.id.btn_01); textView (TextView)this.findViewById(R.id.view_01); btnTest.setOnClickListener(new View.OnClickListener() { Override public void onClick(View arg0) { //启动线程 new MyThread().start(); } }); } class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ super.handleMessage(msg); textView.setText((String)msg.obj); } } class MyThread extends Thread{ public void run(){ Looper.prepare(); //创建该线程的Looper对象 //这里Looper.myLooper()获得的就是该线程的Looper对象了 handler new ThreadHandler(Looper.myLooper()); Message msg handler.obtainMessage(1,1,1,我自己); handler.sendMessage(msg); Looper.loop(); } //定义线程类中的消息处理类 class ThreadHandler extends Handler{ public ThreadHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ //这里对该线程中的MessageQueue中的Message进行处理 //这里我们再返回给主线程一个消息 //加入判断看看是不是该线程自己发的信息 if(msg.what 1 msg.obj.equals(我自己)){ handler new MyHandler(Looper.getMainLooper()); Message msg2 handler.obtainMessage(1,1,1,禀告主线程:我收到了自己发给自己的Message); handler.sendMessage(msg2); } } } } } 附注 上面四个例子的布局文件是同一个文件main.xml ?xml:namespace prefix o ns urn:schemas-microsoft-com:office:office / ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:rientationvertical android:layout_widthfill_parent android:layout_heightfill_parent TextView android:idid/view_01 android:layout_widthfill_parent android:layout_heightwrap_content android:textstring/hello / Button android:idid/btn_01 android:layout_widthfill_parent android:layout_heightwrap_content android:text测试消息 / /LinearLayout 转载于:https://blog.51cto.com/haiyuanxi/957206