欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Looper、Handler应用---实现主线程向子线程发送消息

发布时间:2025/6/15 编程问答 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Looper、Handler应用---实现主线程向子线程发送消息 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

准备知识:

Looper类:为一个线程开启一个消息循环,里面有一个消息队列,新线程是没有开启消息循环的,所以需要用到Looper的方法创建消息循环(主线程除外,主线程会自动为其创建Looper对象,开启消息循环),MessageQueue存放消息和事件 Handler类:辅助类,向绑定的Looper投递消息 Looper原型: Looper.prepare() Looper.loop Looper.quit 代码: [java] view plaincopy
  • package com.test.looper;  
  •   
  • import android.app.Activity;  
  • import android.os.Bundle;  
  • import android.os.Handler;  
  • import android.os.Looper;  
  • import android.os.Message;  
  • import android.util.Log;  
  •   
  • public class MainActivity extends Activity {  
  •     private LooperThread  looperThread;  
  •   
  •     @Override  
  •     public void onCreate(Bundle savedInstanceState) {  
  •         super.onCreate(savedInstanceState);  
  •         setContentView(R.layout.main);  
  •         looperThread = new LooperThread();  
  •         looperThread.start();  
  •         looperThread.getHandler().sendEmptyMessage(1);  
  •     }  
  •       
  •       
  •     class LooperThread extends Thread {  
  •         private Handler mHandler;  
  •         private final Object mSync = new Object();  
  •   
  •         public void run() {  
  •             Looper.prepare();  
  •             synchronized (mSync) {  
  •                 mHandler = new Handler(){  
  •                     @Override  
  •                     public void handleMessage(Message msg) {  
  •                         Log.d("CYQ""--->" + msg);  
  •                     }  
  •                 };  
  •                 mSync.notifyAll();  
  •             }  
  •             Looper.loop();  
  •         }  
  •           
  •         public Handler getHandler() {  
  •             synchronized (mSync) {  
  •                 if (mHandler == null) {  
  •                     try {  
  •                         mSync.wait();  
  •                     } catch (InterruptedException e) {  
  •                     }  
  •                 }  
  •                 return mHandler;  
  •             }  
  •         }  
  •         public void exit() {  
  •             getHandler().post(new Runnable(){  
  •                 public void run() {  
  •                     Looper.myLooper().quit();  
  •                 }});  
  •         }  
  •     }  
  • }  
  • 注意一下几点:

    1、new Handler()必须在子线程的run方法中,否则不是子线程的Handler

    2、在getHandler方法中,我加入了同步,防止线程start了,但是并没有run结束,若此时直接返回mHandler会是一个null(不行可以试试,我一开始郁闷许久,最后在源码中发现有更稳定的实现,所以效仿了,


    后记:

    看来源码还是写得很健壮的,仍需多加学习!

    总结一下(也许不对,请怀疑):

    一个线程有一个对应的Looper,这个Looper就是消息循环,我理解就是提供了一个消息循环的场所,但是消息的投递,消息的处理它不做,它会绑定一个Handler,然后Handler去投递和处理消息,一个线程中实现handleMessage,另外一个线程就可以sendMessage,线程可以主或者子,进而实现线程间消息的传递。

    总结

    以上是生活随笔为你收集整理的Looper、Handler应用---实现主线程向子线程发送消息的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。