❶ Android動態載入調用方法時方法的參數裡面帶有介面,如何獲取介面的回調
在Android中到處可見介面回調機制,尤其是UI事件處理方面,本文給大家介紹android介面回調機制,涉及到android介面回調相關知識,對本文感興趣的朋友可以參考下本篇文章
在使用介面回調的時候發現了一個經常犯的錯誤,就是回調函數裡面的實現有可能是用多線程或者是非同步任務去做的,這就會導致我們期望函數回調完畢去返回一個主函數的結果,實際發現是行不通的,因為如果回調是多線程的話你是無法和主函數同步的,也就是返回的數據是錯誤的,這是非常隱秘的一個錯誤。那有什麼好的方法去實現數據的線性傳遞呢?先介紹下回調機制原理。
回調函數
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
開發中,介面回調是我們經常用到的。
介面回調的意思即,注冊之後並不立馬執行,而在某個時機觸發執行。
舉個例子:
A有一個問題不會,他去問B,B暫時解決不出來,B說,等我(B)解決了再告訴你(A)此時A可以繼續先做別的事情。
那麼就只有當B解決完問題後告訴A問題解決了,A才可以能解決這個問題。
代碼中比如最常用的:
一個Activity中給按鈕一個介面回調方法,只有用戶點擊了這個按鈕,告訴按鈕被點擊了,才會執行按鈕介面回調的方法
❷ android 能用類代替介面實現回調嗎
可以,不過介面是一種規范,能讓一個類的拓展性更強,所以還是盡量使用介面,如果你不能理解的話那就抄別人的代碼,等到你有了一定的開發經驗之後你就會理解為什麼要這樣做
❸ Android 回調介面是啥,回調機制詳解
在Android中到處可見介面回調機制,尤其是UI事件處理方面,本文給大家介紹android介面回調機制,涉及到android介面回調相關知識,對本文感興趣的朋友可以參考下本篇文章
在使用介面回調的時候發現了一個經常犯的錯誤,就是回調函數裡面的實現有可能是用多線程或者是非同步任務去做的,這就會導致我們期望函數回調完畢去返回一個主函數的結果,實際發現是行不通的,因為如果回調是多線程的話你是無法和主函數同步的,也就是返回的數據是錯誤的,這是非常隱秘的一個錯誤。那有什麼好的方法去實現數據的線性傳遞呢?先介紹下回調機制原理。
回調函數
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
開發中,介面回調是我們經常用到的。
介面回調的意思即,注冊之後並不立馬執行,而在某個時機觸發執行。
舉個例子:
A有一個問題不會,他去問B,B暫時解決不出來,B說,等我(B)解決了再告訴你(A)此時A可以繼續先做別的事情。
那麼就只有當B解決完問題後告訴A問題解決了,A才可以能解決這個問題。
代碼中比如最常用的:
一個Activity中給按鈕一個介面回調方法,只有用戶點擊了這個按鈕,告訴按鈕被點擊了,才會執行按鈕介面回調的方法
Button btn = new Button(this);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
那麼下面通過一個Demo理解介面回調:
主線程開啟一個非同步任務,當非同步任務接收到數據,則把數據用TextView顯示出來
1、首先 我們需要定義一個介面,定義一個方法,參數為一個字元串:
package com.xqx.InterfaceDemo;
public interface ChangeTitle {
void onChangeTitle(String title);
}
2、寫一個非同步任務,把介面作為構造方法參數,在doInBackground()方法中判斷如果有數據,則介面回調
package com.xqx.InterfaceDemo;
import android.content.Context;
import android.os.AsyncTask;
public class MyTask extends AsyncTask<String,Void,String>{
private ChangeTitle changeTitle;
public MyTask(ChangeTitle changeTitle) {
this.changeTitle = changeTitle;
}
@Override
protected String doInBackground(String... strings) {
if (strings[0]!=null){
changeTitle.onChangeTitle(strings[0]);
}
return null;
}
}
3、主Activity,給非同步任務參數傳this,即 介面回調方法在此類中執行,那麼就需要實現ChangeTitle介面,重寫介面中
onChangeTitle 方法
package com.xqx.InterfaceDemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity implements ChangeTitle {
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView);
new MyTask(this).execute("我是標題");
}
// 重寫介面方法,執行相應操作
@Override
public void onChangeTitle(String title) {
textView.setText(title);
}
}
❹ android中介面回調問題
好像沒什麼問題,你確定有運行到那裡了嗎?可以試試放到函數的第一行去執行
❺ android 回調方法怎麼寫
package com.smart;
/**
* 定義回調介面
*/
public interface CallBack {
void execute();
}
package com.smart;
/**
* 工具類
*/
public class Tools {
public void test(CallBack callBack){
long begin = System.currentTimeMillis(); //測試起始時間
callBack.execute();///進行回調操作
long end = System.currentTimeMillis(); //測試結束時間
System.out.println("[use time]:" + (end - begin)); //列印使用時間
}
public static void main(String[] args){
Tools tools = new Tools();
tools.test(new CallBack(){
public void execute() {
//A.method(); 測試類A的某個方法執行的時間
//B.method(); 測試類B的某個方式執行的時間
System.out.print("回調" );
}
});
}
}
package com.smart;
/**
* 工具類
*/
public class Tools {
public void test(CallBack callBack){
long begin = System.currentTimeMillis();//測試起始時間
callBack.execute();///進行回調操作
long end = System.currentTimeMillis();//測試結束時間
System.out.println("[use time]:" + (end - begin));//列印使用時間
}
public static void main(String[] args){
Tools tools = new Tools();
tools.test(new CallBack(){
public void execute() {
//A.method(); 測試類A的某個方法執行的時間
//B.method(); 測試類B的某個方式執行的時間
System.out.print("回調");
}
});
}
}
❻ Android動態實現回調介面,就是不適用Android的回調,也能實現類似的功能。
SurfaceView是View的子類,它內嵌了一個專門用於繪制的Surface,你可以控制這個Surface的格式和尺寸,Surfaceview控制這個Surface的繪制位置。surface是縱深排序(Z-ordered)的,說明它總在自己所在窗口的後面。SurfaceView提供了一個可見區域,只有在這個可見區域內的surface內容才可見。surface的排版顯示受到視圖層級關系的影響,它的兄弟視圖結點會在頂端顯示。這意味者 surface的內容會被它的兄弟視圖遮擋,這一特性可以用來放置遮蓋物(overlays)(例如,文本和按鈕等控制項)。注意,如果surface上面有透明控制項,那麼每次surface變化都會引起框架重新計算它和頂層控制項的透明效果,這會影響性能。 SurfaceView默認使用雙緩沖技術的,它支持在子線程中繪制圖像,這樣就不會阻塞主線程了,所以它更適合於游戲的開發。 SurfaceView的使用 首先繼承SurfaceView,並實現SurfaceHolder.Callback介面,實現它的三個方法:surfaceCreated,surfaceChanged,surfaceDestroyed。 surfaceCreated(SurfaceHolder holder):surface創建的時候調用,一般在該方法中啟動繪圖的線程。 surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸發生改變的時候調用,如橫豎屏切換。 surfaceDestroyed(SurfaceHolder holder) :surface被銷毀的時候調用,如退出遊戲畫面,一般在該方法中停止繪圖線程。 還需要獲得SurfaceHolder,並添加回調函數,這樣這三個方法才會執行。 SurfaceView實戰 下面通過一個小demo來學習SurfaceView在實際項目中的使用,繪制一個精靈,該精靈有四個方向的行走動畫,讓精靈沿著屏幕四周不停的行走。
❼ android 按鈕介面回調是怎麼回到主線程的
SurfaceView是View的子類,它內嵌了一個專門用於繪制的Surface,你可以控制這個Surface的格式和尺寸,Surfaceview控制這個Surface的繪制位置。surface是縱深排序(Z-ordered)的,說明它總在自己所在窗口的後面。SurfaceView提供了一個可見區域,只有在這個可見區域內的surface內容才可見。surface的排版顯示受到視圖層級關系的影響,它的兄弟視圖結點會在頂端顯示。這意味者 surface的內容會被它的兄弟視圖遮擋,這一特性可以用來放置遮蓋物(overlays)(例如,文本和按鈕等控制項)。注意,如果surface上面有透明控制項,那麼每次surface變化都會引起框架重新計算它和頂層控制項的透明效果,這會影響性能。 SurfaceView默認使用雙緩沖技術的,它支持在子線程中繪制圖像,這樣就不會阻塞主線程了,所以它更適合於游戲的開發。 SurfaceView的使用 首先繼承SurfaceView,並實現SurfaceHolder.Callback介面,實現它的三個方法:surfaceCreated,surfaceChanged,surfaceDestroyed。 surfaceCreated(SurfaceHolder holder):surface創建的時候調用,一般在該方法中啟動繪圖的線程。 surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸發生改變的時候調用,如橫豎屏切換。 surfaceDestroyed(SurfaceHolder holder) :surface被銷毀的時候調用,如退出遊戲畫面,一般在該方法中停止繪圖線程。 還需要獲得SurfaceHolder,並添加回調函數,這樣這三個方法才會執行。 SurfaceView實戰 下面通過一個小demo來學習SurfaceView在實際項目中的使用,繪制一個精靈,該精靈有四個方向的行走動畫,讓精靈沿著屏幕四周不停的行走。
❽ Android 自定義控制項中實現介面回調時為什麼影響界面繪線
SurfaceView是View的子類,它內嵌了一個專門用於繪制的Surface,你可以控制這個Surface的格式和尺寸,Surfaceview控制這個Surface的繪制位置。surface是縱深排序(Z-ordered)的,說明它總在自己所在窗口的後面。SurfaceView提供了一個可見區域,只有在這個可見區域內的surface內容才可見。surface的排版顯示受到視圖層級關系的影響,它的兄弟視圖結點會在頂端顯示。這意味者 surface的內容會被它的兄弟視圖遮擋,這一特性可以用來放置遮蓋物(overlays)(例如,文本和按鈕等控制項)。注意,如果surface上面有透明控制項,那麼每次surface變化都會引起框架重新計算它和頂層控制項的透明效果,這會影響性能。
SurfaceView默認使用雙緩沖技術的,它支持在子線程中繪制圖像,這樣就不會阻塞主線程了,所以它更適合於游戲的開發。
SurfaceView的使用
首先繼承SurfaceView,並實現SurfaceHolder.Callback介面,實現它的三個方法:surfaceCreated,surfaceChanged,surfaceDestroyed。
surfaceCreated(SurfaceHolder holder):surface創建的時候調用,一般在該方法中啟動繪圖的線程。
surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸發生改變的時候調用,如橫豎屏切換。
surfaceDestroyed(SurfaceHolder holder) :surface被銷毀的時候調用,如退出遊戲畫面,一般在該方法中停止繪圖線程。
還需要獲得SurfaceHolder,並添加回調函數,這樣這三個方法才會執行。
SurfaceView實戰
下面通過一個小demo來學習SurfaceView在實際項目中的使用,繪制一個精靈,該精靈有四個方向的行走動畫,讓精靈沿著屏幕四周不停的行走。
❾ android介面回調的幾種
可以使用Observer,觀察者模式來實現回調。或者介面中傳入類,然後在介面處理之後版,進行調用類權的方法進行回調。
介面回調示例
public interface ConfirmDialogListener{
public void onLeft(Object obj); //按確認鍵
public void onRight(Object obj);//按back鍵
}
public static Dialog confirmDialog(final Context activity, final ConfirmDialogListener listener,final Object obj){
if(listener != null)
listener.onRight(obj);
}
❿ android 介面回調一般怎麼用
.Callback,KeyEvent.Callback,
ce{
/**
*.Thisfieldshouldbemade
*private,soitishiddenfromtheSDK.{@hide}
*/
;
/**
*.Ifthisview
*isnotclickable,itbecomesclickable.
*
*@paraml
*Thecallbackthatwillrun
*
*@see#setClickable(boolean)
*/
publicvoidsetOnClickListener(OnClickListenerl){
if(!isClickable()){
setClickable(true);
}
getListenerInfo().mOnClickListener=l;
}
/**
*.
*/
{
/**
*Calledwhenaviewhasbeenclicked.
*
*@paramv
*Theviewthatwasclicked.
*/
voidonClick(Viewv);
}
}