[英]Android listener / callback How to?
我有一個生成位圖的 pojo 方法。 完成后,我想將位圖扔給 UI 活動。 這是一個示例,但這里是:
private void sendBitmap(Bitmap bitmap) {
// TODO - I'm in the pojo where I want to send the bitmap
}
僅供參考:我想通知的 UI 活動在我的項目之外。 我的意思是,我的項目是一個 SDK,這樣其他開發人員就會在信息可用時立即獲取該信息。
我一直試圖弄清楚這一點,但有點困惑。
我在 MyActivity 中創建了一個回調接口。 到現在為止還挺好。 這是到目前為止的樣子:
import android.graphics.Bitmap;
public class MyActivity {
// protected void whateverOtherMethods (Bundle savedInstanceState)
// {
// .
// .
// .
// .
// .
// .
//
// }
/**
* Callback interface used to supply a bitmap.
*/
public interface MyCallback {
public void onBitmapReady(Bitmap bitmap);
}
}
演示應用程序的 DoSomethingActivity 可以實現我創建的回調接口。 這是演示應用程序的 DoSomethingActivity 中回調的實現:
private final MyCallback myCallback = new MyCallback() {
@Override
public void onBitmapReady(Bitmap bitmap) {
// TODO - do something with the bitmap
}
};
我缺少通知回調的步驟是什么? 也許我幾乎擁有它,但我很困惑,所以我在這里尋求一些幫助。
更新:
好的,我已經為我的回調“BitmapCallback”接口添加了“實現”到 pojo 中。 這里是:
public class ProcessImage implements BitmapCallback {
/**
* pojo method to return bitmap
*/
private void sendBitmap() {
this.onBitmapReady(bitmap);
}
@Override
public void onBitmapReady(Bitmap bitmap) {
// we still need to send the bitmap to cusomer App.
}
我無法從 SDK 活動中移動回調定義,因為我希望客戶的應用程序在其代碼中實現回調,以便在位圖返回到客戶的應用程序時對其進行處理。
這是我的 Activity 中的回調接口:
public interface BitmapCallback {
public void onBitmapReady(Bitmap processedBitmapy);
}
這是客戶應用程序中的實現:
private final BitmapCallback bitmapCallback = new BitmapCallback()
{
@Override
public void onBitmapReady(Bitmap bitmap) {
// TODO Auto-generated method stub
}
};
說我笨,但我很難理解這個問題。
您快到了。 你只需要告訴你的POJO
關於回調實例。 首先,我強烈建議您將接口定義移至POJO
(因為從概念上講,它必須對該對象執行更多操作,而不是對您的活動執行更多操作)或使接口成為獨立類型。 POJO
不應該知道客戶端類中定義的類型。
那么你有一個選擇:
POJO
添加一個字段來存儲回調的實例(或者更復雜的東西,如果你想支持回調多個偵聽器)和一個設置偵聽器的方法。 當您創建或設置POJO
時,從您的活動(或任何合適的地方)調用該方法。在任何一種情況下,當位圖准備好時,您就可以將位圖返回到活動中。
編輯
這是一個如何構建它的示例。 您尚未提供有關如何創建POJO
或調用處理的任何信息,因此我發明了一些東西作為示例。 它假定處理是在單獨的線程中進行的,該線程將在完成后回調活動。 您可以根據需要修改它。 (特別是,如果POJO
同步完成工作,這會簡單得多。此外,最好使用AsyncTaskLoader
而不是普通的普通線程,以便它與Activity
生命周期正確交互。)
位圖回調函數
public interface BitmapCallback {
public void onBitmapReady(Bitmap processedBitmap);
}
我的活動.java
public class MyActivity extends Activity implements BitmapCallback {
Handler mHandler; // initialize this in onCreate
. . .
public void onRequestImage() {
ProcessImage processor = new ProcessImage();
getImage(this /* , other actual args */);
}
@Override
public void onBitmapReady(final Bitmap processedBitmap) {
// since this may be called from a non-UI thread, we can't update
// the UI directly.
mHandler.post(new Runnable() {
@Override
public void run() {
// handle the bitmap (update the UI, etc.)
}
});
}
}
進程圖像
public class ProcessImage {
public void getAnImage(final BitmapCallback callback /* , other formal args */) {
new Thread() {
@Override
public void run() {
Bitmap bitmap;
. . . // do the work
// then deliver the results
callback.onBitmapReady(bitmap);
}
}.start();
}
}
在 pojo 類中創建偵聽器的實例
MyCallback callback;
並在 sendBitmap 方法中設置 onBitmapReady 以通知活動
private void sendBitmap(Bitmap bitmap) {
// TODO - I'm in the pojo where I want to send the bitmap
callback.onBitmapReady();
}
事實證明,為了使回調從意圖內部工作,我需要使回調可序列化。 在嘗試並繼續收到錯誤后,該錯誤反映了 Activity 以某種方式嘗試序列化自身,這導致應用程序崩潰。
所以我回到了最聰明的人,泰德霍普。 根據 Ted 的建議,我最終使用了廣播。 請參閱此處的線程:如何使用 LocalBroadcastManager?
很好的建議,泰德,這解決了我的問題。
經驗教訓:如果您嘗試使用從 SDK 返回到“外部”應用程序的回調並遇到問題,請嘗試查看廣播。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.