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 邏輯層.接口){接口的方法},相當於內部類的用法
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實現接口與結構內的方法,實現處理回調的邏輯