Android回调接口的写法

方法一:

定义一个接口,里面写想要对外提供的方法,在逻辑层方法的参数里传递进去,让在需要的时候调接口里的方法。

实例一:

public class SmsUtils {
	public interface BackUpCallBack{
		/**
		 * 短信调用前调用的方法
		 */
		public void beforeSmsBackup(int total);
		/**
		 * 短信备份中调用的方法 
		 * @param progress 当前备份的进度。
		 */
		public void onSmsBackup(int progress);
	}
	/**
	 * 短信的备份
	 * @param context 上下文
	 * @param od 进度条对话框
	 * @throws Exception 
	 */
	public static void backupSms(Context context,BackUpCallBack backupCallback) throws Exception{
...
		//开始备份的时候,设置进度条的最大值
		backupCallback.beforeSmsBackup(cursor.getCount());
		int progress = 0;
		while (cursor.moveToNext()) {
			Thread.sleep(500);
	....
			//备份过程中,增加进度
			progress++;
			backupCallback.onSmsBackup(progress);
		}
		serializer.endTag(null,"smss");
		serializer.endDocument();
		fos.close();
	}

。。。
SmsUtils.backupSms(getApplicationContext(),new BackUpCallBack() {
							@Override
							public void onSmsBackup(int progress) {
								pd.setProgress(progress);
							}
							@Override
							public void beforeSmsBackup(int total) {
								pd.setMax(total);
							}
						});

  实例二:定义接口也可以写在类外面

public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}
public class HttpUtil {
	public static void sendHttpRequest(final String address,
			final HttpCallbackListener listener) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				HttpURLConnection connection = null;
				try {
				...
					while ((line = reader.readLine()) != null) {
						response.append(line);
					}
					if (listener != null) {
						// 回调onFinish()方法
						listener.onFinish(response.toString());
					}
				} catch (Exception e) {
					if (listener != null) {
						// 回调onError()方法
						listener.onError(e);
					}
				} finally {
					if (connection != null) {
						connection.disconnect();
					}
				}
			}
		}).start();
	}
}

方法二:

  • 定义个接口,里面写上想要对外提供的方法,然后接口写get、set方法(注意是接口,其实有set方法就行了),声明出来在逻辑层代码的方法里,在需要的时候调用接口的方法
  • 用的时候先把逻辑层new出来,然后调用逻辑层.set接口(new 逻辑层.接口){接口的方法},相当于内部类的用法

实例1:

public class MyQueryHandler extends AsyncQueryHandler{
...
	@Override
	protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
		...
		if(cookie!=null && cookie instanceof CursorAdapter){
			CursorAdapter adapter = (CursorAdapter) cookie;
			// 给adapter 设置新的cursor
			adapter.changeCursor(cursor);
		}
		
		if(cursorChangedListener!=null){
			cursorChangedListener.onCursorChanged(token, cookie, cursor);
		}
		
	}
	
	
	public IOnCursorChangedListener getCursorChangedListener() {
		return cursorChangedListener;
	}
	public void setOnCursorChangedListener(IOnCursorChangedListener cursorChangedListener) {
		this.cursorChangedListener = cursorChangedListener;
	}
	private IOnCursorChangedListener cursorChangedListener;
	
	/**
	 * 声明,cursor改变时的监听接口
	 * @author Administrator
	 *
	 */
	public interface IOnCursorChangedListener{
		
		void onCursorChanged(int token, Object cookie, Cursor cursor);
	}
	
}

。。。。
//回调接口写法:这样就把adapter有回传回来了
		MyQueryHandler myQueryHandler = new MyQueryHandler(getContentResolver());
		myQueryHandler.setOnCursorChangedListener(new MyQueryHandler.IOnCursorChangedListener() {
			
			@Override
			/**
			 *  当adapter 获得 cursor 的时候,回调此方法 
			 */
			public void onCursorChanged(int token, Object cookie, Cursor cursor) {
				// 让listview 显示最后一行
				listView.setSelection(adapter.getCount()-1);
			}
		});

  实例2:

  private GestureDetector gestureDetector;  
  
    private OnDeleteListener listener;  
  
  
    public void setOnDeleteListener(OnDeleteListener l) {  
        listener = l;  
    }  
  
    @Override  
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
            float velocityY) {  
  
            deleteButton.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    itemLayout.removeView(deleteButton);  
                    deleteButton = null;  
                    isDeleteShown = false;  
                    listener.onDelete(selectedItem);  
                }  
            });  
    public interface OnDeleteListener {  
  
        void onDelete(int index);  
  
    }  

  下面的内容来自网络 来源: <http://blog.csdn.net/eclipsexys/article/details/22729289>

Java接口回调是个什么玩意儿

java的接口回调,在android下用的是越来越多了,到底该怎么理解他呢?

回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可.

如何定义一个回调 a. 定义接口 : 在类中定义一个Interface, 并在接口中定义一个抽象方法; b. 接口对象 : 在类中定义一个该接口的成员变量; c. 设置对象 : 在类中定义一个公共的方法, 可以设置这个接口的对象, 调用该方法给接口对象成员变量赋值; d. 调用方法 : 在合适的位置调用接口对象中的方法;

好比是一个领导和一个下属,还有一个下属间谍三个人之间不清不楚的关系

1、下属有一个吃饭的事情……

(定义接口)

2、领导发表申明,说对下属的吃饭这件事感兴趣,并说了如果下属吃饭,他就怎么样怎么样,但是老板就是老板,总不能一直盯着下属所以……

(实现接口,并实现处理监听事件的方法)

3、领导一说话,间谍就去了下属那,并且领导给了间谍特权,可以使用我的怎么样怎么样方法

(建立于接口的连接,实际上是一个向上转型的过程,把间谍upcase为一个领导,从而调用领导的方法)

4、,然后只要一吃饭,间谍就通知领导,并替领导完成什么样什么样的事情

(通过接口的实例,调用接口中的方法)

这样一说,大家应该对接口回调的机制有了点感性的理解了吧。

interface People{  
   
   void peopleList();  
   
}  
   
class Student implements People{  
   
   public void peopleList(){  
   
    System.out.println("I’m a student.");  
   
}  
   
}  
   
class Teacher implements People{  
   
  public void peopleList(){  
   
    System.out.println("I’m a teacher.");  
   
}  
   
}  
   
public class Example{  
   
  public static void main(String args[]){  
   
    People a;             //声明接口变量  
   
a=new Student();      //实例化,接口变量中存放对象的引用  
   
a.peopleList();        //接口回调  
   
a=new Teacher();     //实例化,接口变量中存放对象的引用  
   
a.peopleList();       //接口回调  
   
}  
   
}  

通过接口,我们将大量共通但实现细节不同的方法抽象出来,再去实现它的接口类中具体处理,这样通过接口去调用方法的时候,就不用考虑具体调用哪个方法了。

这是一种用法,大致是多态的意思,还有一种用法就是组件中的通信:

例如Fragment间的通信

1、在Fragment中定义接口,申明接口的实例,在onAttach()方法中实现接口实例化为Activity对象

2、在Fragment中的某个方法内,使用接口的实例,调用Activity的方法,向Activity通信

3、Activity实现接口与结构内的方法,实现处理回调的逻辑

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码...

782
来自专栏学习力

《Java从入门到放弃》框架入门篇:Struts2的基本数据传递方式 推荐

1664
来自专栏Fundebug

5分钟掌握JavaScript小技巧

1204
来自专栏xingoo, 一个梦想做发明家的程序员

MFC中注释含义

下面是 CStdioFile 类的部分列表,其中使用了 MFC 在其类中按类成员的用法划分它们时所采用的大多数标准注释: class CStdioFile :...

1967
来自专栏ppjun专栏

Dex热修复原理

市场上热修复有两种一种是基于multidex的更新修复(比如tinker),另外一种是native hook(比如dexposed),tinker这种是反射获取...

1802
来自专栏函数式编程语言及工具

Scalaz(53)- scalaz-stream: 程序运算器-application scenario

    从上面多篇的讨论中我们了解到scalaz-stream代表一串连续无穷的数据或者程序。对这个数据流的处理过程就是一个状态机器(state machine...

1989
来自专栏做全栈攻城狮

电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货

课程总目录:因头条无法自定义目录,大家关注:“做全栈攻城狮”微信公众号。回复“.net目录”,即可获取。微信公众号也包含大量学习教程,等你来~

1323
来自专栏Java帮帮-微信公众号-技术文章全总结

Java 8 Lambda函数编程【面试+工作】

链接:https://pan.baidu.com/s/1q_S2URG8mWKI1nTvPVvDzg 密码:2als

2273
来自专栏智能大石头

深度解析C++拷贝构造函数

自2003年开始,断断续续用了12年C++,直到这两年做物联网嵌入式开发,感觉对C++的掌握仅有10%左右。 习惯了C#开发,C++倒显得难以下手!今天就一个函...

2149
来自专栏好好学java的技术栈

一文看透java8新特性

毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具...

1242

扫码关注云+社区

领取腾讯云代金券