編輯:關於Android編程
在使用接口回調的時候發現了一個經常犯的錯誤,就是回調函數裡面的實現有可能是用多線程或者是異步任務去做的,這就會導致我們期望函數回調完畢去返回一個主函數的結果,實際發現是行不通的,因為如果回調是多線程的話你是無法和主函數同步的,也就是返回的數據是錯誤的,這是非常隱秘的一個錯誤。那有什麼好的方法去實現數據的線性傳遞呢?先介紹下回調機制原理。
回調函數
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
詳細解釋:這樣,在需要的時候,可用Caller對象的mCallback接口成員 調用callback()方法,完成回調。
回調機制在Android框架中的使用
在Activity中定義了很多生命周期的不同狀態要調用的方法,這些方法都是空實現,系統框架要調用,用戶也要調用來實現。
實例(對於Android界面上Button點擊事件監聽的模擬):
a.定義接口
public interface OnClickListener {
public void OnClick(Button b);
b. 定義Button
public class Button {
OnClickListener listener;
public void click() {
listener.OnClick(this);
}
public void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
}
c. 將接口對象OnClickListener 賦給 Button的接口成員
public class Activity {
public Activity() {
}
public static void main(String[] args) {
Button button = new Button();
button.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(Button b) {
System.out.println(clicked);
}
});
button.click(); //user click,System call button.click();
}
}
機制原理如上,那數據傳遞依靠接口怎麼傳遞呢?上代碼:
/* * @author sunglasses * @category 利用xUtils框架封裝get方法,IOAuthCallBack是數據接口回調,send方法裡面 有異步任務方法, * 傳統返回數據方法可能返回數據不正確。 */ public class xUtilsGet { public void getJson(String url,RequestParams params,final IOAuthCallBack iOAuthCallBack){ HttpUtils http = new HttpUtils(); http.configCurrentHttpCacheExpiry(1000 * 10); http.send(HttpMethod.GET, url, params, new RequestCallBack() { @Override public void onFailure(HttpException arg0, String arg1) { // TODO Auto-generated method stub } @Override public void onSuccess(ResponseInfo info) { // TODO Auto-generated method stub iOAuthCallBack.getIOAuthCallBack(info.result); } }); }}
public interface IOAuthCallBack { public void getIOAuthCallBack(String result); }
public void getCataJson(int cityId,IOAuthCallBack iOAuthCallBack) { String url = http://xxxxxxx; RequestParams params = new RequestParams(); params.addQueryStringParameter(currentCityId, cityId+); getJson(url,params,iOAuthCallBack); }
getcatajson是在你想得到數據的類中調用,然後傳入參數和接口對象,接口對象中是要對最終數據進行處理。具體機制原理如上。這樣就可以避免接口回調中的多線程數據不一致問題。
什麼是內存洩露?Android虛擬機的垃圾回收采用的是根搜索算法。GC會從根節點(GC Roots)開始對heap進行遍歷。到最後,部分沒有直接或者間接引用到GC Roo
SlidingPaneLayoutSlidingPaneLayout是Android在android-support-v4.jar中推出的一個可滑動面板的布局,我們提到水
Shutdown 跟 reboot流程很類似,所以這裡以reboot分析:reboot的類型:1、手動長按power鍵選擇reboot;2、adb reboot;3、手動
唉,這個問題困擾很久了,可能原因呢也是有很多種的,就個人遇到的問題,在這裡給大家分享下:運eclipse的時候,就是不能運行出android avd(虛擬機