Android-Java中的回调函数

来源:互联网 发布:平野美宇萝莉 知乎 编辑:程序博客网 时间:2024/06/05 19:15

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的返回结果,可直接往下执行代码)

0 0
原创粉丝点击