精华内容
下载资源
问答
  • 安卓回调
    千次阅读
    2022-02-08 14:21:07

    首先回调函数就是一个函数,形式上和其他函数没有半点区别.

    只不过这个所谓的回调函数是将要被当做参数传递给另一个函数,并被其调用(区别就在这,一般函数的形参,接收的是一个基本类型的变量,而这个函数,接受的参数居然是一个"函数",这个作为参数的函数,就叫回调函数)

    举个例子:

    一般函数:function a(int a, String b):接收的参数是一般类型.

    特殊函数:function b(function c):接收的参数是一个函数,c这个函数就叫回调函数.

    你也可以这么理解:本质区别是,一般一个函数调用另一个函数,被调用的函数是出现在方法体当中,而回调函数比较特殊,它是出现在参数列表当中.也就是说,当调用的时候,需要从其他地方拿到这个(回调)函数,以参数的形式传入.

    一般的函数调用,可以称作是调用.然而另一种,执行时才将某个函数传入再调用的调用方式,就叫"回调",当然,不要纠结于翻译的准不准,主要需要理解本质是什么.

    完全面向对象的语言(例如Java)中没有回调函数的概念,因为"接口"(中的方法)充当了回调函数的作用,也就是说上面的函数b接收的对象是一个接口的实现类对象

    回调函数的概念一般在面向过程或者函数式编程中才出现.

    学过Java语言的童鞋很好理解回调函数,其实就是一个函数的参数是某个接口的实现类.

    初学者对回调函数的理解,可以认为是有个功能我自己不写,交给别人来写,他写完之后,我运行我的程序时,把那个函数传给我就行,然后我来调用他写的函数,实现我的功能.程序灵活性就有了,因为这个功能就可以有多种实现方式而不需要我关心具体实现细节.(另外其他回答中强调"回调"的含义,我也来解释下,回调是针对于被调用的函数来说的,也就是相对于写回调函数的人来说的,我写好一个函数,等着被调用(等着被回调))

    理解回调函数,重点就是:回调函数是作为另一个函数的形参出现的,这和传统思维有很大不同.

    还可以参考
    还可以参考二

    更多相关内容
  • Android开发中我们很多地方都用到了方法的回调回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦他的本质是基于观察者设计模式,即观察者设计模式的的简化版。本文主要对Android中接口回调、...
  • VueAndAndroid Vue和Android交互,Android回调Vue的方法 1.Vue中定义的方法 2.Android中调用Vue的方法
  • 在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的...
  • Android 回调 前言: Android中的回调最经典的就是点击事件设置监听(一般通过switch(v.getId()))这里写个最基本的 btn_rigister.setOnClickListener(new View.OnClickListener() { @Override public void ...
  • android 回调函数

    千次阅读 2022-03-27 15:25:03
    //接口定义 public interface ... //回调方 OnClickListener clickListener; private void initData() { setOnClickListener(this);//设置监听 } @Override public void clickListener(String str.
    //接口定义
    public interface OnClickListener {
        void clickListener(String str);
    }
        //回调方
        OnClickListener clickListener;
        private void initData() {
            setOnClickListener(this);//设置监听
        }
        @Override
        public void clickListener(String str) {
            Logger.d("接受到:"+str);
        }
        //调用方
        public void setOnClickListener(OnClickListener clickListener){
            this.clickListener=clickListener;
        }
       clickListener.clickListener("444");

    注意:执行的顺序:回调方 设置监听(setOnClickListener(this))-> 传参数到调用方(setOnClickListener)->调用方,执行调用( clickListener.clickListener("444"))->再次回到调用方,执行这个方法(clickListener)

    public interface MyCallBack {
        void fail(int code,String str);
    }
    
    public class Myc {
        public void test(int error,MyCallBack mycallback){
            if (error ==1 ){
                mycallback.fail(1,"测试得到: "+1);
            }else{
                mycallback.fail(0,"没有得到1");
            }
        }
    }
    
      new Myc().test(1, new MyCallBack() {
           @Override
           public void fail(int error, String msg) {
            Logger.d(""+msg);
            }
       });
    执行顺序:new Myc().test(..)->test(..)->mycallback.fail(..)->Logger.d(""+msg);
    public class Myc {
        public void setOnClickListener(MyCallBack mycallback){
            this.mycallback=mycallback;
        }
        MyCallBack mycallback;
        public void test(int error){
            if (error ==1 ){
                mycallback.fail(1,"测试得到: "+1);
            }else{
                mycallback.fail(0,"没有得到1");
            }
        }
    }
    
    //运用
     Myc myc;
     private void initData() {
            myc=new Myc();
            myc.setOnClickListener(this);
      }
    //调用
     myc.test(1);
    //回调
      @Override
      public void fail(int code, String str) {
            Logger.d(""+str);
      }

    跟上面的一样逻辑

    展开全文
  • 主函数需要执行耗时操作,于是调用线程池,让耗时操作在另一个线程中执行,执行之后将耗时操作的结果通过回调函数传递给主函数处理。主函数如下,其中耗时操作为somethingForCallBack 耗时操作如下,耗时操作执行完...

    背景

    主函数需要执行耗时操作,于是调用线程池,让耗时操作在另一个线程中执行,执行之后将耗时操作的结果通过回调函数传递给主函数处理。

    主函数如下,其中耗时操作为somethingForCallBack

          
    
    hreadPoolExecutor = new ThreadPoolExecutor(3, 5, 10,
           TimeUnit.SECONDS, new LinkedBlockingDeque<>(2), new
           ThreadFactory() {
                      @Override
                      public Thread newThread(Runnable runnable) {
                          Thread thread = new Thread(runnable);
                          return thread;
                      }
                  }, new ThreadPoolExecutor.DiscardPolicy());
           
         doMethodA = new DoMethodA(threadPoolExecutor, new MethodA() {
             @Override
             public void onComplete(String result) {
                 Log.e(TAG, "result: " + result);
             }
         });
    
    for (int i = 0; i < 10; i++) {
        doMethodA.somethingForCallBack();
    }
    
    

    耗时操作如下,耗时操作执行完之后,调用回调函数的methodA.onComplete(result); 将执行的结果返回给主函数

    public class DoMethodA {
    private ThreadPoolExecutor threadPoolExecutor;
    private MethodA methodA;

    private String TAG = "hhh.DoMethodA";
    
    public DoMethodA(ThreadPoolExecutor threadPoolExecutor,MethodA methodA){
        this.threadPoolExecutor = threadPoolExecutor;
        this.methodA = methodA;
    }
    
    public void somethingForCallBack(){
        Log.e(TAG, "somethingForCallBack: ");
        threadPoolExecutor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String result = "当前线程名称:" + Thread.currentThread().getName() + " threadId:" + Thread.currentThread().getId();
                methodA.onComplete(result);
            }
        });
    }
    

    }

    主函数调用onComplete将结果进行打印:

    2022-06-19 17:41:33.488 21044-21077/com.example.callbackstudy E/hhh.MainActivity: result: 当前线程名称:Thread-2 threadId:847
    2022-06-19 17:41:33.488 21044-21078/com.example.callbackstudy E/hhh.MainActivity: result: 当前线程名称:Thread-3 threadId:848
    2022-06-19 17:41:33.488 21044-21079/com.example.callbackstudy E/hhh.MainActivity: result: 当前线程名称:Thread-4 threadId:849
    2022-06-19 17:41:33.489 21044-21080/com.example.callbackstudy E/hhh.MainActivity: result: 当前线程名称:Thread-5 threadId:850
    2022-06-19 17:41:33.490 21044-21081/com.example.callbackstudy E/hhh.MainActivity: result: 当前线程名称:Thread-6 threadId:851
    2022-06-19 17:41:34.490 21044-21078/com.example.callbackstudy E/hhh.MainActivity: result: 当前线程名称:Thread-3 threadId:848
    2022-06-19 17:41:34.491 21044-21079/com.example.callbackstudy E/hhh.MainActivity: result: 当前线程名称:Thread-4 threadId:849
    
    

    回调函数十张图

    介绍了回调函数的执行线程问题。回调函数在回调函数执行的线程里执行回调具体函数。
    https://blog.csdn.net/itcodexy/article/details/111027346

    展开全文
  • 2.在android中,回调是经常用到的,例如view的点击事件以及各种监听事件。而且还发者在写工具类或者自定义view时,也需要对外提供方法监听,这个时候就要用到回调了。3.自己简单写了一个demo(皇上让太监派人打酱油的...

    1.回调的用处

    1.要实现一个回调,一般需要三个类: 定义接口类、实现接口类、设置触发接口类;

    2.在android中,回调是经常用到的,例如view的点击事件以及各种监听事件。而且还发者在写工具类或者自定义view时,也需要对外提供方法监听,这个时候就要用到回调了。

    3.自己简单写了一个demo(皇上让太监派人打酱油的一个例子,有的地方写了注释,就没有在文章里写了,可以看看注释),呵呵,没有骂人的意思,也不要在意那些细节;写的比较逗比,凑活凑活看吧

    cbb5a6089e3a

    callback.gif

    2.定义回调类

    /** * 打酱油监听事件 */

    public interface BuySoyListener {

    //派遣一个人去买酱油,还有知道这个人是谁

    void dispatch(String name);

    }

    3.皇上activity

    /**

    * 皇上activity

    * */

    public class EmperorActivity extends AppCompatActivity {

    private Button mGoEunuch;

    private TextView mContent;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_emperor);

    mGoEunuch = (Button) findViewById(R.id.m_go_eunuch);

    mContent = (TextView) findViewById(R.id.m_content);

    //跳转到太监activity(让太监挑选一个人去买酱油)

    mGoEunuch.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    //跳到太监类,选人打酱油

    startActivity(new Intent(EmperorActivity.this, EunuchActivity.class));

    }

    });

    //设置监听回调,将实例化对象转到太监类,,注意:重点在于实例化后的接口对象,回调主要通过该实例对象来实现回调的

    //(皇上突然想知道是谁打的酱油,打个电话告诉太监,派遣人员之后,再回个电话告诉我是谁去的)

    EunuchActivity.setOnBuySoyListener(new BuySoyListener() {

    @Override

    public void dispatch(String name) {

    //回调回来的参数显示到界面(太监告诉我,派遣谁去打的酱油)

    mContent.setText(name+ "去打的酱油");

    }

    });

    }

    }

    在皇上类中我们实例化了BuySoyListener接口,里面的重新方法dispatch(String name),是不会立即执行的;接口对象.dispatch("test")时,才会执行当前实例重写方法

    activity_emperor.xml

    android:orientation="vertical"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".EmperorActivity">

    android:id="@+id/m_go_eunuch"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:text="让太监去挑选一个人去打酱油"/>

    android:id="@+id/m_content"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="到底是谁打的酱油????"/>

    太监activity

    /**

    * 太监activity

    * */

    public class EunuchActivity extends AppCompatActivity {

    //定义全局接口对象, 当前接口对象为null

    private static BuySoyListener mBuySoyListener;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_eunuch);

    }

    //主要获取接口对象,可以知道当前接口对象是从哪个类中实现的

    //(太监接到皇上电话,保证派人打酱油之后,就给皇上回电话)

    public static void setOnBuySoyListener(BuySoyListener buySoyListener){

    mBuySoyListener = buySoyListener;

    }

    public void publicOnClick(View view) {

    //判断接口对象是否实例过,如果为null就不往下执行,否则空指针(如果皇上没有打电话过来,就不能自作主张的回电话)

    if (mBuySoyListener== null) return;

    switch (view.getId()){

    case R.id.m_btn1:

    //通过接口对象设置参数,并回调到当前接口对象的实例中的重写方法中; 当前代码执行完,立即执行接口对象实例的重写方法中:EmperorActivity(派遣人员之后,回电话告诉皇上,派遣的人员是谁)

    mBuySoyListener.dispatch("张三");

    break;

    case R.id.m_btn2:

    mBuySoyListener.dispatch("李四");

    break;

    case R.id.m_btn3:

    mBuySoyListener.dispatch("王五");

    break;

    case R.id.m_btn4:

    mBuySoyListener.dispatch("赵六");

    break;

    }

    }

    }

    对外方法setOnBuySoyListener主要用于在外面传递一个接口对象,通过接口对象进行回调参数设置

    activity_eunuch.xml

    android:orientation="vertical"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".EunuchActivity">

    android:id="@+id/m_btn1"

    android:text="张三去打酱油"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:onClick="publicOnClick"/>

    android:id="@+id/m_btn2"

    android:text="李四去打酱油"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_marginTop="10px"

    android:onClick="publicOnClick"/>

    android:id="@+id/m_btn3"

    android:text="王五去打酱油"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_marginTop="10px"

    android:onClick="publicOnClick"/>

    android:id="@+id/m_btn4"

    android:text="赵六去打酱油"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_marginTop="10px"

    android:onClick="publicOnClick"/>

    展开全文
  • Unity 调用Android回调

    千次阅读 2022-04-21 18:38:10
    EXTERNAL_STORAGE", // "android.permission.WRITE_EXTERNAL_STORAGE", // "android.permission.ACCESS_WIFI_STATE", // "android.permission.ACCESS_NETWORK_STATE", // "android.permission.GET_TASKS", // ...
  • 主要介绍了vue 微信分享回调iOS和安卓回调出现错误的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Android回调监听的实现

    2021-06-08 17:10:51
    一、首先定义监听函数 ...所调用的方法就是用户传进来的listener中重写的getKeyValueClick方法,到这里也就是相当于反过来调用回用户所重写的getKeyValueClick(),这里的getKeyValueClick也就是我们常说的回调方法。
  • 本篇文章主要介绍了Android之接口回调机制,在开发中经常会用到,具有一定的学习价值,有需要的可以来了解一下。
  • Android 回调方法的实现 原理 接口可以引用实现了它的类 假设有一个接口ICallBack MainActivity类实现接口 ICallBack可以去引用MainActivity时里面实现方法 CallBack里面有一个ICallBack的引用,调用ICallBack 的...
  • Android 回调的写法

    千次阅读 2020-02-26 21:25:28
    回调的理论分析; 应用场景; ** 代码: ** 首先,写一个接口类: public interface OnListener { void Listener(String code,String msg); } //或者第二种方式 public interface OnListener_2 { void Listener_...
  • Android回调函数demo

    2015-12-08 22:47:35
    回调函数在安卓中的使用,简单明了,一个demo入门了解回调机制
  • 回调与观察者模式的实现原理:废话不多说,直接上Demo回调的原理: 观察者模式: A类中定义一个被观察者画家 package com.example.view; import android.content.Context; import android.graphics.Canvas; ...
  • Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去...
  • 3:WeData_AndroidHelps (回调处理类,单例)【考虑到不少人对委托不太懂,我就把这个的细节代码也附上】 4:WeData (用来处理和安卓的交互的类,单例) 第一步:在GameManager创建一个方法(用来识别是什么平台...
  • android回调demo

    2014-11-24 17:25:09
    android 简单回调demo,让你轻松了解回调机制
  • 回调函数是Android中的一个重要组成部分,Android的点击事件等都离不开回调函数,那么回调函数到底是什么呢,其实回调函数就是从日常生活中的映射,他分两种,一种是同步回调,一种是异步回调,同步回调就相当于是去...
  • 小编典典回调的概念是在另一个类中完成某些工作时通知类同步/异步。有人称其为好莱坞原则:“不要叫我们,我们叫你”。这是一个例子:class A implements ICallback {MyObject o;B b = new B(this, someParameter);@...
  • 回调函数通俗讲,就是为了一些自己写的,用给别人来调用的函数。我还看到一些其他人写的定义:所谓回调,就是对象A调用另一对象B中的某个方法b,然后B又在某个时候反过来调用A中的某个函数c,对于B来说,这个c便叫做...
  • Android回调函数

    千次阅读 2021-07-23 16:57:49
    最近对Android中的回调产生了一些疑问,看了不少博文才算是明白了一点,接下来分享一下我的收获。 写在正文之前,大神可以跳过:  1.接口不可以实例化,但可以创建一个接口对象。*注1:  2.你可能见过这样的语法:...
  • Android 回调队列

    2022-01-04 11:11:24
    此时我们只要将回调加入到一个列表中即可。 class ListenerTest { //注册回调的列表 private var listenerList: MutableList<ITestListener> = mutableListOf() /** * 执行模拟任务 */ init
  • Android-回调机制

    2020-12-15 16:36:58
    Android-回调机制 在Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体...
  • Android 回调函数的理解,实用简单

    万次阅读 2017-03-03 14:42:00
    作者: 夏至,欢饮转载,也请保留这段申明一般我们在不同的应用传递数据,比较方便的是用广播和回调函数,当然还有其他方式,这里学学回调函数的使用; 什么是回调函数呢?在C/C++中,因为我们有指针这个东西,所以...
  • Android程序编码过程中,回调无处不在。从最常见的Activity生命周期回调开始,到BroadcastReceiver、Service以及Sqlite等。Activity、BroadcastReceiver和Service这些基本组件的回调路径和过程也就是通常意义上所谓...
  • Android回调机制详细解释

    千次阅读 2018-02-24 11:34:46
    回调机制基本原理:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 264,371
精华内容 105,748
关键字:

安卓回调

友情链接: suanfa.rar