恳求大神帮小弟解决一个问题~~

付出总会有收获 2015-05-03 12:32:56
小弟刚接触java不久,看不懂这个程序,烦请大神帮我注释一下,非常感谢!!!


class Message{
Object obj;
}
class MessageQueue{
LinkedList<Message> list=
new LinkedList<Message>();
}
class Looper{
MessageQueue mq;
private Handler handler;
public void setHander(Handler handler) {
this.handler = handler;
}
public Looper(){
mq=new MessageQueue();
}
public void loop(){
for(;;){
if(mq.list.isEmpty()){
try{Thread.sleep(3000);}catch(Exception e){}
continue;
}
Message msg=mq.list.removeFirst();
handler.handleMessage(msg);
}
}
}

class Handler{
private Looper looper;
public Handler(Looper looper){
this.looper=looper;
looper.setHander(this);
}
public void sendMessage(Message msg){
this.looper.mq.list.add(msg);
}
public void handleMessage(Message msg){
System.out.println(msg.obj);
}
}

public class Test {

public static void main(String[] args) {
Message msg=new Message();
msg.obj="hello";
Looper looper=new Looper();
Handler h=new Handler(looper){
public void handleMessage(Message msg) {
System.out.println(((String)msg.obj).toUpperCase());
};
};
h.sendMessage(msg);
looper.loop();
}
}
...全文
210 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 qq118194716 的回复:
这个是消息异步处理的一个实现原型。 首先对于组合关系class A,B class A{ B b ; } 外围A访问内部B直接访问即可,因为A组合了b,直接持有其引用 而内部的b需要访问外围的A的时候,是需要持有A的对象的引用才能够使用A对象的方法 这先解释了为什么looper要持有一个handler引用。 //消息,包装任何消息对象 class Message{ Object obj; } //消息队列,保存各类发送过来的消息 class MessageQueue{ LinkedList<Message> list= new LinkedList<Message>(); } //looper是个钩子,想象成回形针,解释如最开始部分 class Looper{ //维持一个消息队列以及持有对handler的引用 MessageQueue mq; private Handler handler; public void setHander(Handler handler) { this.handler = handler; } public Looper(){ mq=new MessageQueue(); } //looper自查消息队列,如果不为空,将调用外围handler的方法处理消息 //意思是它自己并不处理消息,只是检查有没有消息并通知别人去处理 //处理方式采取先进先出依次处理的方式 public void loop(){ for(;;){ if(mq.list.isEmpty()){ try{Thread.sleep(3000);}catch(Exception e){} continue; } Message msg=mq.list.removeFirst(); handler.handleMessage(msg); } } } //处理消息的句柄,这个句柄自带一个钩子,在个钩子回过来还持有这个句柄的引用 //翻译成句柄不知道合不合适,反正只要谁给它发送消息它都会先存起来再处理 //这个消息不一定是自己发给自己的,比如一个独立的线程,很耗时的任务,处理完了将消息发送给它处理 class Handler{ private Looper looper; public Handler(Looper looper){ this.looper=looper; looper.setHander(this); } public void sendMessage(Message msg){ this.looper.mq.list.add(msg); } public void handleMessage(Message msg){ System.out.println(msg.obj); } } public class Test { public static void main(String[] args) { //模拟一个消息 Message msg=new Message(); msg.obj="hello"; //钩子实例,并绑定到handler匿名子类对象的实例上 //该匿名子类只是重写了handleMessage(Message msg)方法而已 Looper looper=new Looper(); Handler h=new Handler(looper){ public void handleMessage(Message msg) { System.out.println(((String)msg.obj).toUpperCase()); }; }; //将消息发送出去,只要任何一个任务持有h,就可以向它发送消息 //这里模拟的是直接发送消息;可以发送很多消息,反正有消息队列可以存储 h.sendMessage(msg); //好了,looper开始自查消息队列,并依次处理消息了 looper.loop(); } } //handler是运行在主线程的,消息可以是其他耗时线程在未知时间运行完后发送的结果 //这样就可以在不阻塞主线程的情况下运行并处理耗时操作结果了 //比如你下载一个图片在ImageView中显示 //如果耗时的下载放在主线程,那么该程序在下载这就卡主了(没法响应其它动作啊),给用户的体验很差 //我只需要另起一个线程处理下载图片任务,当它下载处理完了把图片以消息的形式发出去就可以了 //主线程(通常为UI线程)依旧响应用户的其它各种动作
感激不尽!!!!
飏飏一蝶 2015-05-03
  • 打赏
  • 举报
回复
这个是消息异步处理的一个实现原型。 首先对于组合关系class A,B class A{ B b ; } 外围A访问内部B直接访问即可,因为A组合了b,直接持有其引用 而内部的b需要访问外围的A的时候,是需要持有A的对象的引用才能够使用A对象的方法 这先解释了为什么looper要持有一个handler引用。 //消息,包装任何消息对象 class Message{ Object obj; } //消息队列,保存各类发送过来的消息 class MessageQueue{ LinkedList<Message> list= new LinkedList<Message>(); } //looper是个钩子,想象成回形针,解释如最开始部分 class Looper{ //维持一个消息队列以及持有对handler的引用 MessageQueue mq; private Handler handler; public void setHander(Handler handler) { this.handler = handler; } public Looper(){ mq=new MessageQueue(); } //looper自查消息队列,如果不为空,将调用外围handler的方法处理消息 //意思是它自己并不处理消息,只是检查有没有消息并通知别人去处理 //处理方式采取先进先出依次处理的方式 public void loop(){ for(;;){ if(mq.list.isEmpty()){ try{Thread.sleep(3000);}catch(Exception e){} continue; } Message msg=mq.list.removeFirst(); handler.handleMessage(msg); } } } //处理消息的句柄,这个句柄自带一个钩子,在个钩子回过来还持有这个句柄的引用 //翻译成句柄不知道合不合适,反正只要谁给它发送消息它都会先存起来再处理 //这个消息不一定是自己发给自己的,比如一个独立的线程,很耗时的任务,处理完了将消息发送给它处理 class Handler{ private Looper looper; public Handler(Looper looper){ this.looper=looper; looper.setHander(this); } public void sendMessage(Message msg){ this.looper.mq.list.add(msg); } public void handleMessage(Message msg){ System.out.println(msg.obj); } } public class Test { public static void main(String[] args) { //模拟一个消息 Message msg=new Message(); msg.obj="hello"; //钩子实例,并绑定到handler匿名子类对象的实例上 //该匿名子类只是重写了handleMessage(Message msg)方法而已 Looper looper=new Looper(); Handler h=new Handler(looper){ public void handleMessage(Message msg) { System.out.println(((String)msg.obj).toUpperCase()); }; }; //将消息发送出去,只要任何一个任务持有h,就可以向它发送消息 //这里模拟的是直接发送消息;可以发送很多消息,反正有消息队列可以存储 h.sendMessage(msg); //好了,looper开始自查消息队列,并依次处理消息了 looper.loop(); } } //handler是运行在主线程的,消息可以是其他耗时线程在未知时间运行完后发送的结果 //这样就可以在不阻塞主线程的情况下运行并处理耗时操作结果了 //比如你下载一个图片在ImageView中显示 //如果耗时的下载放在主线程,那么该程序在下载这就卡主了(没法响应其它动作啊),给用户的体验很差 //我只需要另起一个线程处理下载图片任务,当它下载处理完了把图片以消息的形式发出去就可以了 //主线程(通常为UI线程)依旧响应用户的其它各种动作

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧