美文网首页
对java中的接口回调机制理解

对java中的接口回调机制理解

作者: 文艺复兴小青年 | 来源:发表于2018-02-23 22:51 被阅读0次
java接口回调机制想必大家并不陌生,其思想简单,应用广泛,如网络请求、界面的点击监听等,是一个java开发者必须要掌握的基本思想之一。那么我们一起来简单地了解一下java的接口回调,并且掌握其思想和理解其意义。

我们在做java开发时经常会遇到文件下载、请求服务器数据等基本操作,大家都知道网络请求属于耗时操作,我们如果在直接主线程执行这些逻辑时很可能会造成主线程堵塞,从而导致程序崩溃。我们通常都是开启一个子线程来执行网络请求操作。

    public void doSomeWork() {
        new Thread(new Runnable() {
            @Override
            public void run() {

                    // 执行逻辑,发起网络请求,如请求后台数据,下载文件等

            }
        }).start();
}

上面这段代码想必你已经再熟悉不过了,不过当我们在做一次开发时,经常会多次使用网络请求,比如多次请求服务器的数据,所以我们更愿意将其写成一个小框架:

public String doRequest(String url) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                    // 执行逻辑,请求后台json数据

            }
        }).start();
        //将获取的数据转化为String,并返回
    }

那么问题来了:
我们在写成框架时,网络请求是在子线程中进行的,很可能数据还没返回来的时候,doRequest方法就已经执行完了(不懂的就需要去看看守护线程哦),那么这时候返回的数据就没有任何意义了,最终的结果是我们得到的String为空的,而不是我们期待的的数据。

解决此问题的一种方法:
子线程请求到数据后,直接对数据进行处理(缺陷:失去了框架的意义)

public void doRequestAndDealData(String url) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                    // 执行逻辑,请求后台json数据
                    // 直接对获取到的数据进行处理

            }
        }).start();
    }

对比上一段代码,我们这里直接对返回的数据进行了处理,而没有在方法里返回数据,但是这样的处理逻辑就是唯一的了,并不能随着请求的url不同而执行不同的处理逻辑,那么有没有一种方法能将在子线程中获取到的数据"传出去",使其能得到成功的处理呢? 这就是接口回调的巧妙之处了!

①先定义一个接口:


public abstract class CallBackListener {

    public abstract void onFinish()

    public abstract void onError(Exception ex);

}

②在类A中通过在子线程发起网络请求

并将接口作为参数,写到类A中!
public class A {
    public void doRequest(String url,CallBackListener backListener) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    // 执行逻辑,发起网络请求,如请求后台数据,下载文件等
                    backListener.onFinish();

                } catch (Exception ex) {
                    backListener.onError(ex);
                }
            }
        }).start();
    }
}

③在类B中调用类A的对象,发起请求,并且对请求得到的数据进行处理。

public class B {
    public void deal() {
        A a = new A();
        a.doRequest("http://请求的url",new CallBackListener() {
            @Override
            public void onFinish() {
                //请求成功的逻辑,如下载完成后的处理,请求到数据后的处理
            }

            @Override
            public void onError(Exception ex) {
                // 异常逻辑
            }
        });
    }
}

我们在B中调用A的方法时,重写了接口中的方法,当发起的网络请求完成时,就会调用我们重写后的方法,这就是接口回调,这样根据需要来进行不同的重写,同样保留了框架的意义。

我们在下载完成后,界面的点击事件监听,后台数据请求完成时...还有很多地方都可以用到接口回调,掌握其思想后,我们也可以写的更加规范一点了,如将A类中的接口作参数就写为单的一个方法,setListener(CallBackListener listener);大家自己去实践吧。

相关文章

  • java接口回调机制

    转载的正文 地址--理解java接口回调机制

  • 对java中的接口回调机制理解

    java接口回调机制想必大家并不陌生,其思想简单,应用广泛,如网络请求、界面的点击监听等,是一个java开发者必须...

  • Kotlin使用接口回调

    1.Java中的接口回调实现(支持多方法回调) 声明回调接口,初始化接口 使用接口回调(无参数) 使用接口回调(带...

  • Java接口回调机制

    文章出自http://www.sohu.com/a/125632583_445013二、回调的含义和用途1、什么是...

  • Java基础9:解读Java回调机制

    本文主要介绍了Java中的回调机制,以及Java多线程中类似回调的机制。 具体代码在我的GitHub中可以找到 h...

  • Fragment传值到Activity

    采用接口回调机制 在Fragment中定义接口 当Fragment被加载到Activity的时候会被回调,判断宿主...

  • Java相关博客推荐阅读--Java回调机制

    Java回调机制 这篇文章循循渐进的介绍了什么是Java回调机制,以及在Java中的简单实现。通过形象生动的例子,...

  • 理解java 回调机制

    文章来源 “异步+回调”的编程模式 其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在之前就告诉...

  • 接口回调全面总结

    《Java2》接口回调 接口回调定义 接口和类一样,是Java中的一种数据类型,用接口声明的变量称之为接口变量 接...

  • 回调callback

    title: 回调callback 参考: JAVA回调机制(CallBack)详解一个经典例子让你彻彻底底理解j...

网友评论

      本文标题:对java中的接口回调机制理解

      本文链接:https://www.haomeiwen.com/subject/bplfxftx.html