您的位置:首页 > 移动开发 > Android开发

android学习笔记——回调机制

2016-03-20 00:04 483 查看
http://blog.csdn.net/xiaanming/article/details/8703708/ 博主好厉害!终于是在这里看了个明白什么是回调机制。

说下自己的理解,方便以后回顾
首先需要有一个接口,在其中写一个方法。
要有两个类ClassA和ClassB
ClassA中有ClassB的成员对象(也就是ClassA的对象中会包含ClassB这个类的对象,我们想要让B去做一些操作时,就可以直接调用B中的方法了,记得要把接口参数传进去,方便回来。)
ClassB中在实现特定的需要用到的方法时需要 接口参数 (目的就是为了在方法执行完之后,去调用接口中的方法,因为接口是在A中实现的,所以会回到A去)
在ClassA中实现了接口中的方法,为了收到从B方向发回的执行结果。
(上述的过程可以是异步的,也可以是同步的,建议先用异步操作的方式去理解,然后再回过头来思考同步的使用情况,看上述连接!)

下面用一个例子来解释一下回调
先来说一下背景,当我们需要去访问网页向服务器发出请求时,服务器有时不能立即响应我们的请求,而我们程序也不能一直停留等待,还需要做更重要的别的操作。所以,我们需要让子线程去访问服务器,当服务器发回我们所要的信息时,子线程再来通知我们,信息回来了,可以做相应的操作了。那么,子线程来通知主线程的这个动作就是回调机制。(不知道这么理解有没有错)

完成这要的操作需要基本的几个组件
1.ClassA 实现了回调用到的接口,包含ClassB的成员对象,还需要实现接口(也就是回调时 调用的方法)执行对应操作
2.ClassB 做访问服务器的操作,在子线程中进行,当服务器返回结果后通过接口 告知ClassA,执行后续操作。
3.定义好接口。

先做一下接口部分
HttpCallbackListener:

public interface HttpCallbackListener {

void onFinish(String response);

void onError(Exception e);
}

再做一下ClassB的内容
HttpUtil:

public class HttpUtil {

public static void sendHttpRequest(final String address , final HttpCallbackListener listener){

new Thread(new Runnable() {

@Override

public void run() {

HttpURLConnection connection = null;

try{

URL url = new URL(address);

connection = (HttpURLConnection) url.openConnection();

connection.setRequestMethod("GET");

connection.setConnectTimeout(8000);

connection.setReadTimeout(8000);

connection.setDoInput(true);

connection.setDoOutput(true);

InputStream in = connection.getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(in));

StringBuilder response = new StringBuilder();

String line;

while ((line = reader.readLine()) != null){

response.append(line);

}

if (listener != null){

//回调onFinish方法

listener.onFinish(response.toString());

}

}catch (Exception e){

//回调onError方法

listener.onError(e);

}finally {

if (connection != null){

connection.disconnect();

}

}

}

}).start();

}

}

最后我们再来看一下ClassA中要做的事
在A中定义好了B的一个成员变量后

//传入ClassA的对象MainActivity.this 是因为MainActivity实现了HttpCallbackListener这个接口,在回调时就会回到ClassA中

httpUtil.sendHttpRequest("http://www.baidu.com",MainActivity.this);

以上就是我的一些对回调机制的理解了。如果有哪里不对请各位一定指出,大家多交流学习!多谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: