Android和Java中经常遇到有接口回调的代码,之前用的时候也不是太清楚,什么情况下适合用,具体怎么用,脑子中还没有较为清晰的理解。网上也是一大堆各种例子讲解,鱼龙混杂,现对回调函数用自己的理解做个整理,加深自己的印象,不足之处,日后再行补充。

首先拿最常见的Button的点击事件举例来说:

代码:

public class MainActivity extends AppCompatActivity {

    private Button bt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bt = (Button) findViewById(R.id.bt);
        bt.setOnClickListener(new View.OnClickListener() {//B规定的接口
            @Override
            public void onClick(View view) {//回调函数
                bt.setText("被点击了→_→")
            }
        });
    }
}

View的源码中有接口如下:

public static interface OnClickListener {
        void onClick(android.view.View view);
    }

我(A),系统代码(B)

A调用B的setOnClickListener方法,B再回调A写的方法onClickonClick为回调函数,setOnClickListener为注册函数。而A写的onClick方法需要通过B规定的接口限制,传递给B。这就是回调的整个过程。
(PS:该回调是同步回调,调用B的setOnclickListener的时候没有开启线程,若B中的该方法是耗时操作,如下面的网络访问的例子,则需要开启线程实现异步回调)

大白话就是:A通过B规定的接口回调A自己写的函数(如onClick的具体实现)

再来举一个栗子,异步回调的网络访问请求。

代码:(网络请求具体实现类(B))

public class HttpRequest {

    public interface HttpCallBack { // B规定的接口,可单独写到一个类中,这里为了方便写在同一个类中
        void Success(String content); //接口函数里的参数是B要传递给A的数据

        void Failure(String errorMsg);
    }

    //发起网络请求的具体实现
    public void execute(String myurl, HttpCallBack callBack) {
        try {
            URL url = new URL(myurl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(1000 * 3);
            conn.setReadTimeout(2000 * 3);
            int responseCode = conn.getResponseCode();
            Thread.sleep(4000);//延时4秒,模拟耗时操作处理
            if (responseCode == 200) {
                callBack.Success("发送请求成功!!!!!");
            } else {
                callBack.Failure("发送请求失败,请求代码:" + responseCode);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

代码:(网络请求控制类(A))

public class SendRequest {
    public void excute(){
        final HttpRequest request = new HttpRequest();
        final String url = "http://www.bilibili.com/";
        new Thread(new Runnable() {//开启线程,异步处理,不需要等待B的返回结果,可直接往下执行代码
            @Override
            public void run() {
                request.execute(url, new HttpRequest.HttpCallBack() {
                    @Override
                    public void Success(String content) {
                        System.out.print(content);
                    }

                    @Override
                    public void Failure(String errorMsg) {
                        System.out.print(errorMsg);
                    }
                });
            }
        }).start();
        System.out.print("开始玩咯→_→");
    }
}

代码:(测试类)

public class MainTest {
    public static void main(String[] args) {
        SendRequest sendRequest = new SendRequest();
        sendRequest.excute();
    }
}

结果:

开始玩咯→_→
//4秒后再打印请求成功
发送请求成功!!!!!

A新开线程调用B的execute方法发起网络请求,B通过接口将返回结果传递给A并回调A写的SuccessFailure方法。
(PS:异步处理,不需要等待B的返回结果,可直接往下执行代码)