0115Handler(二)
实现线程两种方法 Hanlder在默认情况下与Activity是处于同一线程的 1,实现Runnable接口 2,继承Thread这样一个类 都要实现run函数 启动线程的时候不是调用run函数而是调用start 函数, 调用run函数没有真的启动一个线程,而是在当前线程中执行这个函数 handler.post(runnable对象);此句话并没有调用start();方法,而是直接调用run();
--------------------------------------
Java 标准实现线程和启动线程的方法
Thread t=new Thread(r);
t.start();
Runnable r=Runnable()
{ @override
public void run(){}
};
当调用start方法时候,线程就处于就绪状态,当 cpu的时间片转到,就获得试用权时候
-----------------------------------------
bundle 可以将bundle看成一个相对特殊的map类型 键都是string类型 值是引用类型 就是一个数据存储工具,可以将需要的数据存储到bundle里面
looper作用是循环的从队列中取得消息,在一个线程中使用looper,当队列中没有消息的时候就处于休眠状态 HandlerThread类已经实现了循环处理消息的功能
生成一个 HandlerThread对象,实现了使用Looper来处理消息的队列
Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.
HandlerThread handlerThread=new HandlerThread("handler_thread");
--------------------------------------------------------------
代码解释
MyHandler myHandler=new MyHandler(handlerThread.getLooper());
class MyHandler extends Handler{
public MyHanlder()
{}
public MyHanlder(Looper looper){//接受looper意味着这个 handler接受当前的looper里
//用当前looper所在的线程里的来处理消息队列
//意味着将Handler绑定在另一个线程上来从消息队列取
//这样MyHandler就在另一个线程中了 super(looper);
//调用父类的构造函数,该父类就是就受一个looper }
@override public void handleMessage(Message msg){
}
}
Activity12.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package com.example.mars_activity12; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.app.Activity; import android.view.Menu; public class Activity12 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_activity12); System.out.println( "Activity-->" +Thread.currentThread().getId()); HandlerThread handlerThread= new HandlerThread( "handler_thread" ); //创建新线程 handlerThread.start(); //线程启动,这里面应该自动创建looper有了looper就有queue NewHandler handler= new NewHandler(handlerThread.getLooper()); //将新线程里面的looper传给handler Message msg= handler.obtainMessage(); msg.sendToTarget(); //将消息发送给目标,这个目标是生成这个msg的handler 同handler.sendMessage(msg); } class NewHandler extends Handler{ public NewHandler(Looper looper) //handler接受looper { super (looper); //复写父类的构造函数、、,新创建的handler与新线程的looper绑定 //则新创建的线程handlerThread里的队列控制者looper,与新创建的handler绑定 } @Override public void handleMessage(Message msg) { System.out.println( "handler-->" +Thread.currentThread().getId()); System.out.println( "handleMessage" ); } } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步