android接口回调详解、简单例子+复杂例子

原创 2016年08月30日 17:27:12

使用接口的核心原因:为了能够向上转型为多个基类型。即利用接口的多实现,可向上转型为多个接口基类型。

网上找的图片 感觉不错,通过图片可以很清晰的理解接口回调。

1.接口回调是什么?

接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。

接口回调的实现步骤: 简单的实现例子

1、首先定义一个接口(即回调接口)

package test.ban.com.callback.SimpleCallBack;

/**
 * Created by apple on 16/8/30.
 */

public interface CallBack {

    void doSomeThing(String string);

}

2、定义一个接口帮助类,接口帮助类有方法里面有个参数以是这个接口类型的(即:CallBack 

package test.ban.com.callback.SimpleCallBack;/**
 * Created by apple on 16/8/30.
 */

/**
 * 作者:ban on 16/8/30 16:58
 */
public class CallBackUtils {

    private static CallBack mCallBack;

    public static void setCallBack(CallBack callBack) {
        mCallBack = callBack;
    }

    public static void doCallBackMethod(){
        String info = "这里CallBackUtils即将发送的数据。";
        mCallBack.doSomeThing(info);
    }

}
3、具体调用类,及通过接口传递数据,回调到哪个地方

package test.ban.com.callback.SimpleCallBack;/**
 * Created by apple on 16/8/30.
 */

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

/**
 * 作者:ban on 16/8/30 16:58
 */
public class SimpleCallBackTest extends Activity implements CallBack {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        CallBackUtils.setCallBack(this);

        //1s后调用CallBackUtils的doCallBackMethod()方法。
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                /**
                 *  调用doCallBackMethod方法,目的是将SimpleCallBackTest注册到接口那里,
                 *  使接口知道,需要调用的是哪个类中的,实现该接口的方法。

                 *  调用CallBackUtils.doCallBackMethod()即调用了CallBack.doSomeThing(info)方法;
                 *  通过接口就可以把数据传输到这个类里的doSomeThing()方法里。
                 */
                //
                CallBackUtils.doCallBackMethod();
            }
        }, 1000);


    }

    @Override
    public void doSomeThing(String string) {
        Log.e("========", "拿到CallBackUtils的传递过来的数据=====" + string);
    }
}

复杂点的实现例子

1、首先也是定义一个接口(即回调接口)

<pre name="code" class="java">package test.ban.com.callback;/**
 * Created by apple on 16/8/30.
 */

import android.graphics.Bitmap;

/**
 * 作者:ban on 16/8/30 16:10
 */
public interface ImageStateInterface {

    void onImageStart();

    void onImageSuccess(Bitmap bitmap);

    void onImageFailed();

    void OnEnd();
}



2、帮助类
package test.ban.com.callback;/**
 * Created by apple on 16/8/30.
 */

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * 作者:ban on 16/8/30 16:11
 */
public class DownloadImageUtil {

    public static void StartDownLoad(final ImageStateInterface imageStateInterface,
                                     final Context context) {
        //该imageStateInterface使其得知,是从哪里注册过来的,然后根据其来源调用其实现的接口方法。

        //如下,此时调用的就是MainActivity.this中实现的onImageStart方法。
        imageStateInterface.onImageStart();

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    new Thread().sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Bitmap bitmap = BitmapFactory.decodeResource(
                        context.getResources(), R.mipmap.ic_launcher);
                imageStateInterface.onImageSuccess(bitmap);
            }
        }).start();
        imageStateInterface.OnEnd();
    }
}

3、两种实现方式。第二种方式即找个匿名接口实现类帮助我们()
package test.ban.com.callback;/**
 * Created by apple on 16/8/30.
 */

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 作者:ban on 16/8/30 16:10
 */
public class MainActivity extends Activity implements ImageStateInterface {
    private Button button;
    private TextView mTextView;

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

        /**
         * 实例化控件
         */
        //实现方式一 (推荐)
        onLincoln();
        //实现方式二
        //onLincolnTwo();

    }

    /**
     * 实现方式一  这个需要  implements ImageStateInterface 接口
     */
    private void onLincoln() {
        button = (Button) findViewById(R.id.button);
        mTextView = (TextView) findViewById(R.id.tv);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                DownloadImageUtil downloadImageUtil = new DownloadImageUtil();
                /**
                 调用StartDownLoad方法,目的是将MainActivity注册到接口那里,
                 使接口知道,需要调用的是哪个类中的实现该接口的方法。
                 */
                downloadImageUtil.StartDownLoad(MainActivity.this,
                        getApplicationContext());
            }
        });

    }

    @Override
    public void onImageStart() {
        Log.d("lincoln", "onImageStart");
        button.setText("onImageStart");
        mTextView.setText("onImageStart");

    }

    @Override
    public void onImageSuccess(final Bitmap bitmap) {
        Log.d("lincoln", "onImageSuccess");
        runOnUiThread(new Runnable() {

            @SuppressLint("NewApi")
            @Override
            public void run() {
                button.setText("onImageSuccess");
                mTextView.setText("onImageSuccess");
                button.setBackground(new BitmapDrawable(bitmap));
            }
        });
    }

    @Override
    public void onImageFailed() {

    }

    @Override
    public void OnEnd() {
        Toast.makeText(MainActivity.this, "完成啦!!", Toast.LENGTH_SHORT).show();
    }
    /**---------------------实现方式一 结束------------------------*/


    /**
     * --------------------------实现方式二-----------------------------
     */

    private void onLincolnTwo() {
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                DownloadImageUtil.StartDownLoad(imageInterface,
                        MainActivity.this);
            }
        });

    }

    ImageStateInterface imageInterface = new ImageStateInterface() {

        @Override
        public void onImageStart() {
            Log.d("lincoln", "onImageStart");
            button.setText("onImageStart");
        }

        @Override
        public void onImageSuccess(final Bitmap bitmap) {
            Log.d("lincoln", "onImageSuccess");
            runOnUiThread(new Runnable() {

                @SuppressLint("NewApi")
                @Override
                public void run() {
                    button.setText("onImageSuccess");

                    button.setBackground(new BitmapDrawable(bitmap));
                }
            });
        }

        @Override
        public void onImageFailed() {

        }

        @Override
        public void OnEnd() {
            Toast.makeText(MainActivity.this, "哈哈!!", Toast.LENGTH_SHORT).show();
        }
    };
    /**-----------------------------------------------------------------------------*/

}

源码地址:http://download.csdn.net/detail/u010566681/9617131

后续有续集 在这个基础上 进行了优化,然后继续增加一个例子帮助理解。

http://blog.csdn.net/u010566681/article/details/52371901

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java/Android中的函数调用&回调函数&自定义回调函数

在Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需...

android接口回调第二种优化写法详解、另外附赠简单例子

原本写法:即方法一,这次主要推荐使用方法二,详见改进。 方法一: 接口回调的实现步骤: 简单的实现例子 回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参...

Android 回调接口是啥,回调机制详解

首先解决啥是回调: 举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。...

对Android中“回调”的理解

最近看书或者博客的时候老是遇到回调函数、回调接口,在没有搞懂的情况下继续学习,头都是大的。于是看了很多博客,现在总算是弄明白了一点,以下写出自己对Android中“回调”的很粗浅的理解。 首先说一下...

Android 中的接口回调

http://blog.csdn.net/wangjinyu501/article/details/22052187   在Android中到处可见接口回调机制,尤其是UI事件处理方面。举一...

Android 调用系统email程序发邮件

//系统邮件系统的动作为android.content.Intent.ACTION_SEND Intent email = new Intent(android.content.Intent.ACT...

Android的接口回调的Demo实例

在平常开发中总是会涉及到回调这个词,作为一个新手,我觉得必须要好好了解下回调的机制,以及该怎么用。 想看机制的可以看看这一篇文章:http://www.2cto.com/kf/201502/37715...

安卓开发接口回调经典案例网络请求

在Android中到处可见接口回调机制,尤其是UI事件处理方面。然后一般刷新ui的处理:广播,接口回调,handle或者使用eventbus或是otto,总的来说也就是个监听模式的使用吧。回调函数解释...

面试复习——Android工程师之Android面试大纲

文章会不定期更新,欢迎关注我的博客 Activity面试题 Fragment面试题 Service面试题 Broadcast Receiver面试题 WebView面试题 Binder面试题 Hand...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)