導航:首頁 > 操作系統 > android實現回調

android實現回調

發布時間:2023-02-19 00:35:36

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的jni線程中實現回調

您好,很高興能幫助您
如果是C/C++回調,你只要參考linux的線程指南,在線程函數中傳入回調函數地址就行了。如果是要回調到java層,稍微復雜點。
首先,你需要在onload的時候,找到回調函數所在的類,用全局變數保存:
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
LOGE("JNI_OnLoad start");
jint version;
g_vm = vm; // 全局變數保存
JNIEnv *env;
jobject cls;
version = vm->GetEnv((void **)&env, JNI_VERSION_1_2);

if (env)
{
g_clazz = env->FindClass(CLASS_CustomSurfaceView); // 全局變數保存
}

LOGE("JNI_OnLoad finish g_clazz = 0x%x", g_clazz);
return JNI_VERSION_1_2;
}

在JNI啟動線程的時候,需要把線程掛到JVM上,不然不能訪問Java。你有了g_vm, g_clazz, 以及env,就可以做回調操作了。
// 線程函數

void *threadFunc(void *data)
{
JNIEnv *env = MNull;
int ret = g_vm->AttachCurrentThread( (JNIEnv **) &env, MNull); // 掛到JVM
if (ret < 0)
{
LOGE("fail to attach");
return;
}
// TODO: 在這里做你的回調操作

g_vm->DetachCurrentThread(); // 從JVM卸載
return;
}

你的採納是我前進的動力,
記得好評和採納,答題不易,互相幫助,

㈢ 如何在android的jni線程中實現回調

JNI回調是指在c/c++代碼中調用java函數,當在c/c++的線程中執行回調函數時,會導致回調失敗。

其中一種在Android系統的解決方案是:

把c/c++中所有線程的創建,由pthread_create函數替換為由Java層的創建線程的函數AndroidRuntime::createJavaThread。

假設有c++函數:

[cpp] view plain
void *thread_entry(void *args)
{
while(1)
{
printf("thread running...\n");
sleep(1);
}

}

void init()
{
pthread_t thread;
pthread_create(&thread,NULL,thread_entry,(void *)NULL);
}

init()函數創建一個線程,需要在該線程中調用java類Test的回調函數Receive:

[cpp] view plain
public void Receive(char buffer[],int length){
String msg = new String(buffer);
msg = "received from jni callback:" + msg;
Log.d("Test", msg);
}

首先在c++中定義回調函數指針:

[cpp] view plain
//test.h
#include <pthread.h>
//function type for receiving data from native
typedef void (*ReceiveCallback)(unsigned char *buf, int len);

/** Callback for creating a thread that can call into the Java framework code.
* This must be used to create any threads that report events up to the framework.
*/
typedef pthread_t (* CreateThreadCallback)(const char* name, void (*start)(void *), void* arg);

㈣ android單例中的監聽如何回調

1) OnClickListener 介面
此介面處理的是單擊事件,例如,在 View 上進行單擊動作,在 View 獲得焦點的情況下單擊「確定」按鈕或者單擊軌跡球都會觸發該事件。
當單擊事件發生時,OnClickListener 介面會回調 public void onClick(View v) 方法對事件進行處理。其中參數 v 指的是發生單擊事件的 View 組件。
2) OnLongClickListener 介面
此介面處理的是長按事件,當長時間按住某個 View 組件時觸發該事件。
其對應的回調方法為 public boolean onLongClick(View v),當返回 true 時,表示已經處理完此事件,若事件未處理完,則返回 false,該事件還可以繼續被其他監聽器捕獲並處理。
3) OnFocusChangeListener 介面
此介面用於處理 View 組件焦點改變事件。當 View 組件失去或獲得焦點時會觸發該事件。
其對應的回調方法為 public void onFocusChange(View v, Boolean hasFocus),其中參數 v 表示產生事件的事件源,hasFocus 表示事件源的狀態,即是否獲得焦點。
4) OnKeyListener 介面
此介面用於對手機鍵盤事件進行監聽,當View獲得焦點並且鍵盤被敲擊時會觸發該事件。
其對應的回調方法為 public boolean onKey(View v, int keyCode, KeyEvent event)。

㈤ Android里怎麼介面回調的方法從fragment向Activity傳值

介面回調實現步驟
1:定義介面
2:activity實現介面,實現介面方法
3:fragment得到介面對象,在內容載入完後調用介面方法
4:在activity中介面回調方法得到回傳值
fragment---->介面回調--->activity

㈥ android 設置呼叫轉移成功回調

具體方法:
1)無條件呼叫轉移,開通:*72要轉達的號碼,再按撥打鍵。取消:*720,再按撥打鍵。
2)遇忙呼叫轉移,開通:*90要轉達的號碼,再按撥打鍵。取消:*900,再按撥打鍵。
3)無應答,關機呼叫轉移。開通:*92要轉達的號碼,再按撥打鍵。取消:*920,再按撥打鍵。
4)遇忙呼叫轉移,無信號,無應答,關機呼叫轉移。開通:*68要轉達的號碼,再按撥打鍵。取消:*680,再按撥打鍵。

㈦ android回調是怎麼實現的

被調用者定義一個介面。
調用者實現介面,把回調函數代碼寫在這個實現類特定的方法中。把這個類的實例作為參數傳給被調用者
被調用者調用這個對象的方法,實現回調

㈧ 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 點擊回調傳遞

在使用MultiTypeAdapter實現RecyclerView多類型顯示的時候,會創建一個ViewHolder和ViewBinder,此時如果要在Activity或者Fragment相應點擊事件的時候,需要在ViewHolder和ViewBinder之間做傳遞。如果一個ViewHolder下有RecyclerView,然後也使用了MultiTypeAdapter,那麼這個點擊事件的回調將會是一件相當頭疼的事情。

在使用 LifeCycle 時,發現他只需要當前類實現 LifecycleObserver ,然後通過調用 addObserver 方法即可實現事件傳遞。由此想到點擊事件是否也可以使用此種形式來實現。

DEMO

在受到 LifeCycle 的啟發下,模仿這寫了幾個類。

一個點擊事件如果在某個類中如果需要做操作,那麼需要實現該介面。

繼承OnItemClick,並實現具體的方法。

基本點擊事件Observer

這一層,對事件在OnBindViewHolder中做了一次傳遞,通過dispatchObserver方法,將ViewBinder中的事件傳遞到了ViewHolder中。

定義兩個點擊事件。

創建實體類,和Binder相對應。

在覆寫 setData 方法的時候,一定要調用super。不然事件無法傳遞。

響應事件的回調,只需要調用 getObserver 方法,然後傳入對應的Observer,如果有,就直接調用方法。

adapter傳遞事件,也是通過dispatchObserver方法。

ViewBinder其實就不需要做什麼事情了,比較簡單。

閱讀全文

與android實現回調相關的資料

熱點內容
excel表格單列數據加密 瀏覽:646
給同事的解壓話語 瀏覽:990
linux關閉網卡命令行 瀏覽:452
史上最漂亮程序員 瀏覽:768
java實現excel的導入 瀏覽:758
光遇賬號如何轉移安卓 瀏覽:266
5分之13除以26的演算法 瀏覽:342
蘭州安寧區買解壓包子 瀏覽:641
php接收圖片代碼 瀏覽:668
hci命令 瀏覽:662
福建伺服器大區雲空間 瀏覽:840
筆桿子程序員 瀏覽:745
手機軟體易驗證加密 瀏覽:589
文檔加密只讀模式也不能看到 瀏覽:431
把jpg轉換成pdf的軟體 瀏覽:874
linuxeth0mac 瀏覽:192
windows編程知乎 瀏覽:442
壓縮工期超過40 瀏覽:249
Android怎麼優化內存 瀏覽:106
linuxetcsysconfig 瀏覽:396