博主好厉害!终于是在这里看了个明白什么是回调机制。
说下自己的理解,方便以后回顾
首先需要有一个接口,在其中写一个方法。
要有两个类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);
以上就是我的一些对回调机制的理解了。如果有哪里不对请各位一定指出,大家多交流学习!多谢!