Callback定义?

a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time.

The invocation may be immediate as in a synchronous callback or it might happen at later time, as in an asynchronous callback.

In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable.

不难看出callback是在一个Class中把一段代码以argument的形式发送到另外一个class中调用。

我们在android中经常用onClickListnere的Onclick()这就是一个回调方法。 学过js的人应该很明白callback因为js基本都是用callback的。

Callback实例1

//声明一个接口
public interface ICallBack {
void postExec();
}
//另外一个类有方法里面有个参数以是这个接口类型的
public class FooBar {
private ICallBack callBack;
public void setCallBack(ICallBack callBack) {
this.callBack = callBack;
}
public void doSth() {
callBack.postExec();
}
}

FooBar中接收一个实现callback方法类然后调用doSth()方法时调用对用的callback方法,然后真正实现callback方法的类中就会触发并执行callback方法中的代码。

public class Test {
public static void main(String[] args) {
FooBar foo = new FooBar();
foo.setCallBack(new ICallBack() {
public void postExec() {
System.out.println("method executed.");
}
});
foo.doSth();//调用函数
}
}

在Test,通过FooBar的setCallBack方法以参数的形式把callback方法实现类传递给FooBar,当调用foo.doSth();会触发callback()方法。

Callback实例2

学过设计模式的mvp的人应该知道callback怎么实现的。 MVP中M是具体操作类可以理解为操作DB。V是有关GUI的即View那个中间指挥者就是P。

比如说登录login。通过V我们会获取到账号密码,然后再M中验证数据账号密码是否匹配,然后重新回到V中更新UI。

package com.amap.login;

import android.content.Context;

public interface ILoginModel {
void login(String userid, String password, Context context, OnLoginFinishedListener listener);
}
package com.amap.login;

import android.content.Context;

public interface ILoginPresenter {

	void validateCredentials(String userid, String password, Context context);
void onDestroy(); }
package com.amap.login;

public interface ILoginView {

	void showProgress();

	void hideProgress();

	void userIdNotFoundError();

	void passwordNotFoundError();

	void userIdNullPointError();

	void passwordNullPointError();

	void onUserLoginError();

	void navigateToHome();

}

我们分别定义了MVP模式中的代表M,V,P接口类。

package com.amap.login;

import android.content.Context;
import android.os.Handler;
import android.text.TextUtils; import com.amap.bean.User;
import com.amap.common.UserDataManager; public class LoginModelImpl implements ILoginModel{
private UserDataManager mUserDataManager;
public static final String PREFERENCE_NAME = "UserInfo";
public static int MODE = Context.MODE_PRIVATE;
public LoginModelImpl() {
this.mUserDataManager = UserDataManager.getInstence();
} @Override
public void login(final String userid, final String password,final Context context, final OnLoginFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (TextUtils.isEmpty(userid)) {
listener.onUserIdNullPointError();
return;
}else if (TextUtils.isEmpty(password)) {
listener.onPasswordNullPointError();
return;
}
//User user = mUserDataManager.findUserByAccAndPwd(username,password);
User user = mUserDataManager.fetchOneUser(userid);
if(user == null){
listener.onUserIdNotFoundError();
return;
} else{
if (user.getPassword().equals(password)) {
//if (user.getStatus().equals("1")) { // listener.onUserLoginError();
// return;
//} else {
user.setUserId(userid);
user.setPassword(password);
user.setImage(user.getImage());
user.setName(user.getName());
mUserDataManager.saveSharedPreferences(user,
context);
user.setStatus("1");
mUserDataManager.updateUserStatusByAcc(userid, "1");
UserDataManager.setSelf(user);
listener.onSuccess();
//}
} else {
listener.onPasswordNotFoundError();
return;
} }
}
}, 1000);
} }
package com.amap.login;

import android.content.Context;

public class LoginPresenterImpl implements ILoginPresenter,OnLoginFinishedListener{

	ILoginModel loginModel = null;
ILoginView loginView = null; public LoginPresenterImpl(ILoginView loginView) { loginModel = new LoginModelImpl();
this.loginView = loginView;
} @Override
public void validateCredentials(String userid, String password, Context context) {
if(loginView != null) {
loginView.showProgress();
}
loginModel.login(userid, password, context, this); } @Override
public void onDestroy() {
// TODO Auto-generated method stub
} @Override
public void onSuccess() {
if(loginView != null) {
loginView.navigateToHome();
}
} @Override
public void onUserIdNotFoundError() {
// TODO Auto-generated method stub
if(loginView != null) {
loginView.userIdNotFoundError();
loginView.hideProgress();
}
} @Override
public void onUserIdNullPointError() {
// TODO Auto-generated method stub
if(loginView != null) {
loginView.userIdNullPointError();
loginView.hideProgress();
}
} @Override
public void onPasswordNotFoundError() {
// TODO Auto-generated method stub
if(loginView != null) {
loginView.passwordNotFoundError();
loginView.hideProgress();
}
} @Override
public void onPasswordNullPointError() {
// TODO Auto-generated method stub
if(loginView != null) {
loginView.passwordNullPointError();
loginView.hideProgress();
}
} @Override
public void onUserLoginError() {
// TODO Auto-generated method stub
if(loginView != null) {
loginView.onUserLoginError();
loginView.hideProgress();
}
}
}
package com.amap.login;

public interface OnLoginFinishedListener {

	void onUserIdNotFoundError();

	void onUserIdNullPointError();

	void onPasswordNotFoundError();

	void onPasswordNullPointError();

	void onUserLoginError();

	void onSuccess();
}
package com.amap.activity;

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.amap.customview.MyProgress;
import com.amap.friends.R;
import com.amap.login.ILoginView;
import com.amap.login.LoginPresenterImpl; public class LoginActivity extends Activity implements OnClickListener,ILoginView { private EditText mAccount;
private EditText mPwd;
private Button button_login;
private TextView user_register;
private Dialog ProgressBar_login;
private LoginPresenterImpl loginPresenterImpl; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initListener();
} public void initView() {
setContentView(R.layout.activity_login);
mAccount = (EditText) findViewById(R.id.editText_useracc);
mPwd = (EditText) findViewById(R.id.editText_password);
button_login = (Button) findViewById(R.id.button_login);
user_register = (TextView) findViewById(R.id.user_register);
ProgressBar_login = MyProgress.createLoadingDialog(this, getString(R.string.login_msg)); } public void initListener() {
button_login.setOnClickListener(this);
user_register.setOnClickListener(this);
loginPresenterImpl = new LoginPresenterImpl(this);
} public void login() {
loginPresenterImpl.validateCredentials(mAccount.getText().toString()
.trim(), mPwd.getText().toString().trim(), getApplicationContext());
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_login:
login();
break;
case R.id.user_register:
navigateToRegister();
break;
default:
break;
}
} @Override
public void showProgress() {
// TODO Auto-generated method stub
ProgressBar_login.show();
} @Override
public void hideProgress() {
// TODO Auto-generated method stub
ProgressBar_login.hide();
} public void navigateToRegister() {
// TODO Auto-generated method stub
startActivity(new Intent(this, RegisterActivity.class));
finish();
} @Override
public void navigateToHome() {
// TODO Auto-generated method stub
startActivity(new Intent(this, MainActivity.class));
finish();
} @Override
public void userIdNotFoundError() {
// TODO Auto-generated method stub
Toast.makeText(this, R.string.login_userid_fail, Toast.LENGTH_SHORT).show();
} @Override
public void passwordNotFoundError() {
// TODO Auto-generated method stub
Toast.makeText(this, R.string.login_password_fail, Toast.LENGTH_SHORT).show();
} @Override
public void userIdNullPointError() {
// TODO Auto-generated method stub
Toast.makeText(this, R.string.account_empty, Toast.LENGTH_SHORT).show();
} @Override
public void passwordNullPointError() {
// TODO Auto-generated method stub
Toast.makeText(this, R.string.pwd_empty, Toast.LENGTH_SHORT).show();
} @Override
public void onUserLoginError() {
// TODO Auto-generated method stub
Toast.makeText(this, R.string.login_exist, Toast.LENGTH_SHORT).show();
}
}

从以上的代码可以看出callback的好处。Activity中的代码构造比较清晰易懂。

没有calback基本不知道怎么在别的class中操作以后更新UI。

有了callback可以直接在别的class中简洁的更新UI了。非常cool~~~

Callback2.0的更多相关文章

  1. 前端测试框架 jasmine 的使用

    最近的项目在使用AngulaJs,对JS代码的测试问题就摆在了面前.通过对比我们选择了 Karma  + jasmine ,使用 Jasmine做单元测试 ,Karma 自动化完成,当然了如果使用 K ...

  2. Jasmine基础语法

    简介 Jasmine 是JavaScript的测试框架,它不依赖其他框架,也不依赖DOM,更重要的是它语法简单.以下实例都是基于Jasmine 2.5.2的,并且来自官网:https://jasmin ...

  3. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  4. ZAM 3D 制作3D动画字幕 用于Xaml导出

    原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...

  5. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  6. osg编译日志

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

  7. 【译】Android 6.0 Changes (机翻加轻微人工校对)

    Android 6.0 Changes In this document Runtime Permissions Doze and App Standby Apache HTTP Client Rem ...

  8. Android 6.0 新功能及主要 API 变更

    运行时权限 这个版本中引入了新的权限模型,现在用户可以在运行时直接管理应用程序的权限.这个模型基于用户对权限控制的更多可见性,同时为应用程序的开发者提供更流畅的应用安装和自动升级.用户可以为已安装的每 ...

  9. Android 6.0 Changes

    原文链接:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html 伴随着新特性和功能,Andr ...

随机推荐

  1. jenkin报错hudson.plugins.git.GitExcept

    清除工作空间 转载请注明博客出处:http://www.cnblogs.com/cjh-notes/

  2. mvc4中使用angularjs实现一个投票系统

    数据库是用EF操作,数据表都很简单中,从代码中也能猜出表的结构,所以关于数据库表就不列出了 投票系统实现还是比较简单,投票部分使用ajax实现,评论部分是使用angularjs实现,并且页面每隔几秒( ...

  3. P2764 最小路径覆盖问题(网络流24题之一)

    题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...

  4. 深入理解JVM一性能监控工具

    一.前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮 ...

  5. QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

    QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->ad ...

  6. Linux之Json20160705

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易 ...

  7. 对SLIP,PPP,PPPoE,EtherNet的理解。[zz]

    经常看到PPP,PPPoE这些名词,当时也查了不少的资料,但是一直不太理解这是什么东西,干什么用的,今天静下心来,多看了点资料,有了一些初步理解,记录下来,以后有了新的理解再修改.   首先,SLIP ...

  8. python 获取外网地址

    def get_ip(): try: url = "http://cn.bing.com/search?q=ip&go=%E6%8F%90%E4%BA%A4&qs=n& ...

  9. openstack配置模块

    一.简介 openstack中负责处理配置的模块是oslo.config,它可以处理配置项和配置文件.通常的配置处理都是如下形式: from oslo.config import cfg CONF=c ...

  10. 使用nginx做反向代理

    很多同学喜欢用nginx做反向代理访问某些网站,原因大家都懂的,今天老高记录一下如何使用nginx做反向代理以及如何配置和优化nginx的反向代理. 准备工作 首先,你需要一个稳定的国外的便宜的VPS ...