簡體   English   中英

Android 監聽器/回調 怎么做?

[英]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,這樣其他開發人員就會在信息可用時立即獲取該信息。


我一直試圖弄清楚這一點,但有點困惑。

  1. 我需要一個“回調”接口嗎?
  2. 還是“偵聽器”接口?
  3. 或兩者?

我在 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不應該知道客戶端類中定義的類型。

那么你有一個選擇:

  1. 使用偵聽器模式:在你的POJO添加一個字段來存儲回調的實例(或者更復雜的東西,如果你想支持回調多個偵聽器)和一個設置偵聽器的方法。 當您創建或設置POJO時,從您的活動(或任何合適的地方)調用該方法。
  2. 使用回調模式:使用回調參數增強相關的 API 方法。

在任何一種情況下,當位圖准備好時,您就可以將位圖返回到活動中。

編輯

這是一個如何構建它的示例。 您尚未提供有關如何創建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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM