博主好厉害!终于是在这里看了个明白什么是回调机制。



说下自己的理解,方便以后回顾

首先需要有一个接口,在其中写一个方法。


要有两个类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);




以上就是我的一些对回调机制的理解了。如果有哪里不对请各位一定指出,大家多交流学习!多谢!