Java——接口与回调

回调是一种常见的程序设计模式。这种模式中,可以指定某个特定事件发动时应该采取的动作。例如,可以直接在按下鼠标或者选择某个菜单时应该采取什么行动。

问:接口回调是什么? 

答:简单的说就是自己定义一个接口和方法,然后由另一个类去实现接口中的方法,最后自己再从该类中调用自己定义的这个接口中的方法。举个栗子:小红对小明说:“小明,这道题目怎么做?“,小明看了题目之后回答:“这道题目有点难,我做好了告诉你!”小红说:“嗯,我先去小微那边复习功课,你解决问题之后来小薇那边告诉我!”,过了几分钟小明做好了马上就到小微那边,找到小红告诉她这到题目的答案。在这个栗子中,小红定义了一个接口—>“我在小薇那边”,定义了一个接口中的方法—>“获取这道题目的答案”,她没有自己去实现,而是将这个问题交给了小明—>“注册接口到小明这边”,小红通过小明完成了这道题目并告诉自己—>“接口的回调”。

问:为什么要使用接口回调? 
答:在项目中我们经常会碰到这种情况:需要对某个事件进行监听,因为不知道该事件什么时候会给我们反馈数据回来,通过接口回调这种方式可以很方便的进行不同类之间的数据传递,注册一个接口,当该事件有数据反馈时能马上获取该数据,同时又可以减少类之间的耦合度;

接口回调三部曲:

  1. 创建接口;
  2. 注册该接口到数据提供方并调用该接口中的方法;
  3. 在数据接收方回调该接口获取数据;

创建接口

public interface CallBackInterface {
    void getResult(String answer);
}

注册该接口到数据提供方并调用该接口中的方法,也可以传递信息过去

public class Service1 extends Service {

    private static final String TAG = "Service1";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        doSomeThing();
    }

    private void doSomeThing() {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                String answer = "这道题目是这样的...";//要返回的数据
                callback.getResult(answer);
            }
        },3000);
    }

    private static CallBackInterface callback;
    public void registInterface(String question,CallBackInterface callback){
        Log.i(TAG, "小红问小明: "+question);//获取小红传过来的数据
        this.callback=callback;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

在数据接收方回调该接口获取数据,当然也可以传递数据出去

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

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

    private void start() {
        Intent intent = new Intent(this, Service1.class);
        startService(intent);
    }

    private void ForHelp() {
        Service1 service1 = new Service1();
        String question = "小明,这道题目怎么做?";//传递数据到小明
        service1.registInterface(question, new CallBackInterface() {
            @Override
            public void getResult(String answer) {
                Log.i(TAG, "小明过了3秒回答到: " + answer);//接收到了小明的数据
            }
        });
    }
}

 

你可能感兴趣的:(Java)