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
原创粉丝点击