精华内容
下载资源
问答
  • 在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的...
  • Android接口回调机制精炼详解

    万次阅读 多人点赞 2018-06-18 12:44:12
    面向接口编程是面向对象编程中的一个很重要的概念,即“接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类中实现的接口方法”。 (2)方法的调用和方法的实现 Java中所有的方法会出现在两个地方...

    一、前期基础知识储备

    (1)面向接口编程

    面向接口编程是面向对象编程中的一个很重要的概念,即“接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类中实现的接口方法”。

    (2)方法的调用和方法的实现

    Java中所有的方法会出现在两个地方——方法的调用和方法的实现,而且在Java中两者是分开的,即方法的实现写在一个地方,方法的调用写在另一个地方。比如:

    A类中创建set()方法和具体实现,public void set(String s){//方法的具体实现};

    B类中传入参数,调用set()方法,a.set(“Android Cool”);

    接口回调中,接口方法的实现和接口方法的调用就是分开的。

    (3)接口回调/回调函数

    回调函数 不是 由该函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用,用于对该事件或条件进行响应。即接口方法的调用和接口方法的实现在不同的地方。(定义接口的地方往往和接口方法调用的地方在一块)。

    (4)接口回调的结果

    接口回调的结果:接口变量调用被实现的接口的方法

    二、上代码,具体实现

    接口回调的实例中通常会有:

    两个类:一个类实现接口和实现该接口的方法,即完成接口方法的定义;另一个类中定义接口和接口中的方法,并且提供注册接口的方法接口变量调用被实现的接口的方法

    两个类+一个接口:具体步骤和上面一样,只不过接口的定义不在放在类中,而是单独抽离出来。

    (1)《Android群英传》自定义View,为自定义View设立点击事件

    自定义View类中:

    ①定义点击接口和接口中的方法;

    public interface OnTopBarClickListener {
        // 左按钮点击事件
        void leftClick();
        // 右按钮点击事件
        void rightClick();
    }

    ②创建注册接口的方法,暴露接口给调用者;

    private OnTopBarClickListener mListener;
    
    public void setOnTopBarClickListener(OnTopBarClickListener listener) {
        mListener = listener;
    }

    ③接口变量调用被实现的接口方法;

        mLeftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    mListener.leftClick();
                }
            }
        });
    
        mRightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    mListener.rightClick();
                }
            }
        });

    主Activity类中:

    以匿名类的形式注册接口,实现接口中的方法

        mTopBar.setOnTopBarClickListener(new TopBar.OnTopBarClickListener() {
            @Override
            public void leftClick() {
                Toast.makeText(MainActivity.this, "点击了 返回", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void rightClick() {
                Toast.makeText(MainActivity.this, "点击了 更多", Toast.LENGTH_SHORT).show();
            }
        });

    点击左右按钮,可以看见弹出对应的toast。

     

    分析:注册接口的方法至关重要,它关联起调用接口方法的类(自定义View类)和实现接口方法的类(Activity类),注意看以下注册接口的代码:

    public void setOnTopBarClickListener(OnTopBarClickListener listener),里面传入的形参是接口变量,但是Activity类中注册接口时是以匿名内部类的完成的,即

    mTopBar.setOnTopBarClickListener(new TopBar.OnTopBarClickListener() {}):

    注册接口方法里面里面传入的实参是接口的实例对象,从这里就体现出面向接口编程的中要义——接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类中实现的接口方法。即,

    public voidsetOnTopBarClickListener(OnTopBarClickListener listener) {

       mListener = listener;

    }

    这里的接口变量mListener存储了实现接口的类的对象的引用,即mListener持有实现了接口的匿名内部类的引用,所以mListener就可以直接调用该匿名内部类中实现的接口方法,即是

    mListener.leftClick();

    mListener.rightClick();

    最后看一下按钮点击事件发生时,代码的执行顺序:

    1)首先是两个按钮的点击事件的onClick()方法;

    2)在onClick()方法内部调用mListener.leftClick()和mListener.rightClick();

    3)最后是Activity中的leftClick()和rightClick()方法,结果为弹出不同的弹窗。

    (2)RecyclerView中的适配器Adapter相关的点击事件

    ①创建独立接口;

    public interface IPhoneEvent {
        void setPhoneBitmap(int position, Bitmap bitmap);
    }

    ②主Activity类中实现接口和实现接口中的方法;

    public class PhoneActivity extends BaseEditFragment implements IPhoneEvent{
    ...
        @Override
        public void setPhoneBitmap(int position, Bitmap bitmap) {
            if (position == 0) {
                if (isAdded()) {
                    Log.d(TAG, "setPhoneBitmap: ---");
                    Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.phone2);
                    mFreePuzzleView.setPhoneBitmap(position, mBitmap);
                    showBtnCommit();
                }
            } else {
                mFreePuzzleView.setPhoneBitmap(position, bitmap);
                showBtnCommit();
            }
        }}

    ③适配器Adapter类中创建接口变量和调用被实现的接口的方法;

            imageHodler.imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Bitmap bmp = BitmapFactory.decodeResource(v.getResources(),  mPhoneList.get(position).getImageId());
                    mIPhoneEvent.setPhoneBitmap(position, bmp);
                    Log.d(TAG, "onBindViewHolder onClick: ");
                }
            });

    分析:这里的接口方法需要传入参数position,获取RecyclerView子Item的位置数据,所以接口方法的调用是写在了onBindViewHolder()中。注意,在这里接口的实现是直接在外部Activity进行实现的,而不是以匿名内部类的形式实现,所以这里没有出现注册接口的方法,那么是如何初始化接口变量呢?

    通过适配器类的构造方法,即

        @Override
        public void onBindViewHolder(ViewHolder holder, final int position) {
            imageHodler.imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Bitmap bmp = BitmapFactory.decodeResource(v.getResources(),  mPhoneList.get(position).getImageId());
                    mIPhoneEvent.setPhoneBitmap(position, bmp);
                    Log.d(TAG, "onBindViewHolder onClick: ");
                }
            });
        }

     

    分析:结合以上两个例子,我们可以看出整个接口回调代码的起点就是在——接口变量调用被实现的接口方法,该方法的调用在第一个自定义View的例子中是由按钮的点击事件发起的;在第二个例子中是由RecyclerView的子ItemView被点击时发起的。

    接口回调是面向接口编程的一个很重要的运用,往往平时中很多地方都会用到,但不能说出所以然,所以通过本篇文章的分析,希望可以抛砖引玉。

    最后在延伸一点知识:接口变量的实例化

    我们都知道,接口变量直接调用接口方法,然后实现接口和实现接口变量的地方写出方法的具体实现,这样两段代码分工明确,这也是面向接口编程的核心思想,如上面代码中适配器中定义接口、接口方法、接口变量,并且使用接口变量直接调用接口方法,而适配器接口方法的实现放在了Activity中。

    这里面还有一点关键的知识点,就是接口变量的初始化:“接口的引用指向他的实例化对象”,即可通过实例化实现接口的类的方式实例化一个接口如:MyListener mListener = new XXXX(); XXXX即为实现MyListener接口的类,这里就是通过实例化实现接口的类的方式实现一个接口变量的初始化。

     

     

    展开全文
  • 本篇文章主要介绍了Android接口回调机制,在开发中经常会用到,具有一定的学习价值,有需要的可以来了解一下。
  • 在Android中到处可见接口回调机制,尤其是UI事件处理方面,这里介绍android接口回调机制,涉及到android接口回调相关知识 在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程...
    在Android中到处可见接口回调机制,尤其是UI事件处理方面,这里介绍android接口回调机制,涉及到android接口回调相关知识
     
    在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致咱们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误。那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理。
    回调函数
    回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,咱们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
    开发中,接口回调是经常用到的。
    接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行。
    举个例子:
    A有一个问题不会,他去问B,B暂时解决不出来,B说,等咱(B)解决了再告诉(A)此时A可以继续先做别的事情。
    那么就只有当B解决完问题后告诉A问题解决了,A才可以能解决这个问题。
    代码中比如最常用的:
    一个Activity中给按钮一个接口回调方法,只有用户点击了这个按钮,告诉按钮被点击了,才会执行按钮接口回调的方法
    
    Button btn = new Button(this);
        btn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
             
          }
        });
    
    那么下面通过一个Demo理解接口回调:
    主线程开启一个异步任务,当异步任务接收到数据,则把数据用TextView显示出来
    1、首先 咱们需要定义一个接口,定义一个方法,参数为一个字符串:
    
    package com.xqx.InterfaceDemo;
    public interface ChangeTitle {
      void onChangeTitle(String title);
    }
    
    2、写一个异步任务,把接口作为构造方法参数,在doInBackground()方法中判断如果有数据,则接口回调
    
    package com.xqx.InterfaceDemo;
    import android.content.Context;
    import android.os.AsyncTask;
    public class MyTask extends AsyncTask<String,Void,String>{
      private ChangeTitle changeTitle;
      public MyTask(ChangeTitle changeTitle) {
        this.changeTitle = changeTitle;
      }
      @Override
      protected String doInBackground(String... strings) {
        if (strings[0]!=null){
          changeTitle.onChangeTitle(strings[0]);
        }
        return null;
      }
    }
    
    3、主Activity,给异步任务参数传this,即 接口回调方法在此类中执行,那么就需要实现ChangeTitle接口,重写接口中
    onChangeTitle 方法
    
    package com.xqx.InterfaceDemo;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    public class MainActivity extends Activity implements ChangeTitle {
      private TextView textView;
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        new MyTask(this).execute("我是标题");
      }
      // 重写接口方法,执行相应操作
      @Override
      public void onChangeTitle(String title) {
        textView.setText(title);
      }
    }

    展开全文
  • Android开发中我们很多地方都用到了方法的回调回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦他的本质是基于观察者设计模式,即观察者设计模式的的简化版,例如:在下载时候的进度回调,在...
  • 这是我自己画的关于接口回调的运行机制,可能大家会没那么容易看懂 但是不要紧,其中最关键的就是懂得一句话:所谓回调,就是让别的类来调用自己类的一个方法,这个方法就是“回调方法”。那么,我们就要搞明白...

    很多人都搞不懂什么是JAVA的接口回调,我在写这篇文章的前两天也搞不懂,找了好多资料,好多例子,但是依然很容易搞混了,最后,自己琢磨着画了张图,才渐渐明了了起来。不多说,先上图
    这是我自己画的关于接口回调的运行机制,可能大家会没那么容易看懂
    这里写图片描述
    但是不要紧,其中最关键的就是懂得一句话:所谓回调,就是让别的类来调用自己类的一个方法,这个方法就是“回调方法”。那么,我们就要搞明白一件事,如何让别的类调用自己类方法呢?在这里,采用的是接口作为中间的媒介(其实很多人认为,回调就只能用接口,其实不是的,回调只是一种机制,但是并不一点采用接口,至于为什么采用接口,只是为了程序的解耦,提高代码的复用性。纯属个人理解,不喜勿喷)。
    接下来讲讲如何采用接口作为中间媒介实现回调机制的。
    在业务实现中,我们经常发现有这样一个需求,举个Android中的例子:比如我们需要向一个输入框EditText填充一个字符串(功能A),但是这个填充是需要等到用户执行了某个其他操作才动态填充的(不确定填充时间,不确定填充内容),这个时候,我们就要知道什么时候用户执行了这个操作,然后调用填充字符串这个方法。这个时候我们就可以采用回调来实现(当然不同的业务场景也可以有不同的实现方法)
    下面,我们就通过这个例子+代码来分析回调的机制的执行过程
    首先,先创建一个中间媒介——接口

    public interface  CallBack {
        public void OnCallBack(String str);
    }
       然后创建一个模拟EditText的类并继承接口CallBack,实现OnCallBack()方法
    
    /*
     * 这是模拟EditText填充的类
     */
    public class EditText implements CallBack{
    
        public void OnCallBack(String str) {
            // TODO Auto-generated method stub
            setEdiText(str);
        }
        public void setEdiText(String s){
            System.out.println("拿到数据"+s+",开始填充EditText...");
        }
        public void demand(){
            System.out.println("我需要填充EditText");
        }
    }
    
       然后创建一个模拟用户操作的类,此类执行用户操作,执行完毕后调用callBack方法,此时就产生了回调。
    
    /*
     * 这是一个模拟用户操作的类。
     */
    public class User_Do {
        CallBack call ;//创建接口引用,
        /*
        *创建一个方法,用于动态绑定接口,可为不同的继承了接口的类进行绑定即传说中的注册回调接口。
        */
        public void setCallBack (CallBack call){
            this.call=call;
        }
        public void Do(){
            System.out.println("用户正在执行操作..");
            call.OnCallBack("123");//执行完操作,回调方法给EditText,填充数据为123
        }
    }
        接下来是测试类
    
        /*
     * 这是一个测试类
     */
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            EditText et = new EditText();//创建一个EditText类。
            et.demand();//声明需求
    
            User_Do ud = new User_Do();
            ud.setCallBack(et);//注册回调接口,绑定EditText。
            ud.Do();//用户执行操作,执行完毕后,回调接口方法给EditText填充
        }
    }

    最后运行结果如图所示

    反正大家记住一句话,回调回调,就是让别人来调用自己的方法,这个方法利用接口来实现就是接口中抽象的方法。
    最后,用一副图总结一下:
    这里写图片描述

    展开全文
  • 本人自己也经常在开发中遇到接口回调机制,说来惭愧,虽然一直在用接口,但是只是去复制别人的代码,一直弄不明白接口回调的原理,甚至自己也努力去看了很多篇文章,几乎看了所有的接口回调的例子,什么延时问答啊,...

    本人自己也经常在开发中遇到接口回调机制,说来惭愧,虽然一直在用接口,但是只是去复制别人的代码,一直弄不明白接口回调的原理,甚至自己也努力去看了很多篇文章,几乎看了所有的接口回调的例子,什么延时问答啊,孔融让梨啊,都看了,例子都能背下来了,两三个月了还没理解。看来本人头脑不是一般的笨。哎。。。。。

    也许是用多了吧,今天不知道怎么地灵光乍现了,突然就理解了。下面我就用我自己的理解方式说说接口回调机制。Andorid的button的setOnClickListener绝对是一个金典的接口回调例子,大家都经常这样写对吧,然后我们点了这个button就可以执行我们在onClick里面的代码了。这是个金典的例子,建议从这个例子去看源码上手叫容易。我就直接上步骤上代码上图了。


    全手写,图也是自己画的,懂的勿喷,高手请绕道。(如果人品不错麻烦点个赞大笑


      fragmentb_bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   //执行代码...
                }
            });


    先上接口回调步骤,

    1.定义一个接口,接口里面写执行的方法

        public interface GetData {
            void onCli(String str);//参数自定义
        }


    2.需要引用的地方持有该接口的引用

     private GetData getData;


    3.持有该接口的地方生成该接口的set方法

    public void setGetData(GetData getData) {
            this.getData = getData;
        }


    4.需要调用的地方调用接口

          setGetData(new GetData() {
                @Override
                public void onCli(String str) {
    		//需要执行方法的代码...
                    Toast.makeText(this.getContext(),str,Toast.LENGTH_LONG).show();
                }
            });


    5.设置接口值
     getData.onCli("我不是瞎BB");


    我分的比较详细,5步就能搞定了,代码很简单,相信都能看懂。前三步非常简单应该都没什么问题,就是后两步估计有点不好理解,(反正我就是被后两步搞的头回脑胀才理解不的,应该说是被这两步误导了,总听人说button的点击事件就是回调机制,然后我就天真的以为,调用了setOnClickListener就是最后一步,然后自己测试的时候每次都空指针。)其实我们可以想一想,我们每次在setOnClickListener里面写了代码,但是运行的时候马上执行了吗?并没有,是不是需要点击了按钮之后才会调用写的代码?所以我写的例子最后一步应该是我们设置了这个参数后,第四步写的代码才会被执行。Button的setOnClickListener也是,只不过setOnClickListener的onClick的参数是View,不需要我们手动去设置。如果还不懂再看下面一张图。



    如果实在理解不了,那么接口回调的初始化的步骤千万不要错了,按照1.2.3.4.5的方法去写绝对Ok。(不过应该没有比我还蠢的人了吧安静



    展开全文
  • Java接口回调机制

    2020-12-22 20:16:42
     近在看androidFragment与Activity进行数据传递的部分,看到了接口回调的内容,来总结一下。  二、回调的含义和用途  1、什么是回调?  一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为...
  • 以前对于这个机制理解不够深刻,现在重新整理下思路。 一、建模 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你...于是接口回调机制比喻模型如下 第一步:vcD4
  • 通过简单的自定义Dialog来理解接口回调callback机制
  • 看见网上一些回调的解释都很复杂的,特别基于Android的自定义回调,感觉一头雾水,于是乎,我也写了这篇基于我对回调的解释。 先来看一个简单的例子: 有两个类 ClassA ,和 ClassB, ClassA调用ClassB里面的方法, ...
  • 这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。 下面我们拿具体的...
  • 首先解决啥是回调: 我觉得这个例子比较好:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它...
  • Android java回调机制与自定义接口回调方法 发表于 2015-04-15 | 分类于 Android学习  | 摘自:...
  • Android onclick监听 接口回调机制 解析

    千次阅读 2016-03-07 17:44:44
    Java的回调机制之前一直不太明白,只知道(嗯,这个地方好像是采用了回调,balabala),这两天工程不是很忙就抽了些时间从源码上学习巩固一下。 在Android上,最经典的回调应该是监听器Onclick回调了,其实还有...
  • 接口回调Demo

    2017-02-15 14:37:20
    android中,接口回调是一种很常见的机制,它可以大大降低代码间耦合性,提高程序的复用性。我们经常碰到的点击事件就是利用的接口回调机制。这里我利用接口回调回传AsyncTask下载的数据~
  • Android接口回调、方法回调

    万次阅读 2016-08-14 17:48:22
    Android中方法的的回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦,现在来举个例子看看它的应用场合,例如在activity中的listview与adapter类之间的传递: 一、方法回调 在listview的item中有个...
  • Android接口回调传递数据

    千次阅读 2015-11-17 15:08:03
    一 、回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这...Java 中没有指针的概念,通过接口和内部类的方式实现回调的功能: 1. 定义接口 Callback ,包含回
  • Android接口回调,最简单的理解方式

    万次阅读 多人点赞 2015-09-02 21:23:15
    Android中为什么定义那么多接口,很大一部分都是用来接口回调的,包括那些OnListener等系统给出接口都是这种用法。1.Java中的回调函数理解一个东西,必须从它的本源入手,再实例化到生活事例中,加深理解,毕竟...
  • Android 回调接口是啥,回调机制详解

    万次阅读 多人点赞 2015-07-16 22:45:27
    首先解决啥是回调: 举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过...
  • Android接口回调interfaceCallBack

    千次阅读 2017-11-13 15:03:12
    2,接口回调,传值用的,灵活的应用可以使代码飘逸多变,这个也是一直纠结于接口理解的原因。 这边只想简单说说最基本的接口回调, 首先定义一个,里面含有某抽象方法,方法里面需要参数;  其次在某个位置...
  • Android中基于回调接口的确权机制.pdf
  • android handler与回调机制的结合运用

    千次阅读 2016-11-23 11:37:20
    android 中在进行耗时...所以可以在Thread中使用回调机制。定义包含回调函数的类 1.自定义接口 2.实现接口对象 3.为对象赋值 (在需要的调用的地方new接口对象实现接口) 4.回调接口 把数据传回需要的地方public
  • Android技术开发之接口回调机制总结

    千次阅读 2016-08-15 14:28:01
    今天讲讲android开发中比较常用的接口回调机制。我自己对接口回调的理解就是:比如点击一个button的时候,如果你给button设置了一个监听器,即调用了方法:btn.setOnClickListener(new View.OnClickListener() { @...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,531
精华内容 16,212
关键字:

android接口回调机制