zoukankan      html  css  js  c++  java
  • 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实现接口与结构内的方法,实现处理回调的逻辑

  • 相关阅读:
    EventBus总结(原)
    StarUML 破解方法2.X(转)
    扩展阿里巴巴Java开发规约插件(转)
    Java 代码规范,你应该知道的一些工具和用法(转)
    使用IntelliJ IDEA 15和Maven创建Java Web项目(转)
    Git--将已有的项目添加到github(转)
    单元测试汇总
    Intellij idea创建javaWeb:实现JSP/Servlet(转)
    设计模式学习之中介者模式(转)
    jvm加载包名和类名相同的类的规则,以及如何加载包名和类名相同的类(转)
  • 原文地址:https://www.cnblogs.com/sixrain/p/5610682.html
Copyright © 2011-2022 走看看