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的接口回调,在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实现接口与结构内的方法,实现处理回调的逻辑

上一篇:前端制作动画的几种方式(css3,js)


下一篇:使用回调接口实现ActiveX控件和它的容器程序的通讯