Handler与回调
来源:互联网 发布:禅道数据库配置文件 编辑:程序博客网 时间:2024/06/03 14:12
去金山面试的时候,面试官曾经提出这个问题,“可以使用Handler来接收,处理消息,也可以自己实现回调机制来接收处理消息,为什么不自己实现回调机制呢?”
当时回答不上来,自己也没亲手去实践下,今天抽点时间解决下这儿问题。
我自己实现了下回调机制,代码如下:
//callblack1.java
package com.example.handler;public interface callback1 {public void change();}
//SelfHandler
package com.example.handler;public class SelfHandler {public int message;public void setMessage(callback1 callback,int n){message = n;callback.change();}}
//MainActivity
package com.example.handler;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.widget.TextView;public class MainActivity extends Activity implements callback1{public SelfHandler selfhandler = new SelfHandler();private TextView text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text = (TextView) this.findViewById(R.id.textview1);<span style="color:#ff0000;">/*Thread thread = new Thread(){public void run() {try {Thread.sleep(5000);} catch (InterruptedException e) { }selfhandler.setMessage(MainActivity.this,1);}};thread.start();*/selfhandler.setMessage(MainActivity.this,1);</span>}@Overridepublic void change() {// TODO Auto-generated method stubif(selfhandler.message == 1){text.setText("hello SelfHandler");}}}运行下,text的内容变为hello SelfHandler
自己实现回调机制,成功接受处理消息。
那既然这样子,我们又何必要引入Handler呢?
我们再看下面的例子
将MainActivity中的代码稍微更改下。
package com.example.handler;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.widget.TextView;public class MainActivity extends Activity implements callback1{public SelfHandler selfhandler = new SelfHandler();private TextView text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text = (TextView) this.findViewById(R.id.textview1);<span style="color:#ff0000;">Thread thread = new Thread(){public void run() {try {Thread.sleep(5000);} catch (InterruptedException e) { }selfhandler.setMessage(MainActivity.this,1);}};thread.start();//selfhandler.setMessage(MainActivity.this,1);</span>}@Overridepublic void change() {// TODO Auto-generated method stubif(selfhandler.message == 1){text.setText("hello SelfHandler");}}}更改的内容为新建一个子线程,在线程中使用回调。
运行的结果为:程序崩溃,错误提示为:only the original thread that created a view hierarchy can touch its views
即只有在UI线程中才能更改view。
但我们在子线程中使用handler,却不会发生错误(自己尝试下)
总结下,
在不同的Activity,class,线程中传递,处理消息,使用handler,都能使回调操作正确返回在UI线程上执行。
而自己实现回调机制,如我上面所写,只能实现不同Activity,class中传递,处理消息。并没有Handler功能强大。
其实,面试这个问题最好的回答,我后来给的解释是:“已经有Handler类了,代码简洁,程序易阅读。功能强大,干嘛要自己没事找事做,还一大堆BUG。”
0 0
- Handler与回调
- android handler与回调机制的结合运用
- 函数回调代替handler
- 开线程池在子线程下载,用接口回调与Handler返回结果
- Android Thread 与 Handler
- Android AsyncTask与handler
- Handler与Android多线程
- Looper.prepare() 与 handler
- 通过handler与message
- 关于AsyncTask与Handler
- Looper与Handler
- android Handler 与 HandlerThread
- Android AsyncTask与handler
- Android AsyncTask与handler
- Android AsyncTask与handler
- Android AsyncTask与handler
- Handler与HandlerThread
- 关于AsyncTask与Handler
- aaa
- 前缀树
- poj 2342 树状DP
- PAT数组-13. 螺旋方阵(20)
- android按钮使用shape美化
- Handler与回调
- OD过程中遇到的小问题
- 对象序列化
- c++ 使用mat文件问题-配置
- oracle 嵌套查询(给我自己看的)
- OK335XD开发板挂载文件系统
- HDU 1754 线段树
- java 泛型的使用
- Oracle索引