2014-09-23 91 views
1

我有一個pojo方法來生成一個位圖。完成後,我想將位圖引入UI活動。這是一個樣本,但在這裏它是:Android監聽器/回調如何?

private void sendBitmap(Bitmap bitmap) { 
    // TODO - I'm in the pojo where I want to send the bitmap 
} 

FYI:我想通知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 
    } 
}; 

什麼是我缺少通知回調步驟?也許我幾乎可以擁有它,但是我很困惑,我在這裏尋找一些幫助。


UPDATE:

OK,我已經添加了 「工具」 爲我的回調 「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活動動,因爲我想客戶的應用,以實現他們的代碼來處理位圖時,它返回到客戶的應用回調。

這是在我的活動回調接口:

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   
    } 
}; 

叫我啞巴,但我有一個很難得到我的頭繞着這個。

+0

你在回看什麼事件?如果它的點擊事件,你應該看看OnClickListener,你可以調用你的自定義偵聽器。 http://developer.android.com/reference/android/view/View.OnClickListener.html – Peshal 2014-09-23 23:52:44

+0

爲什麼會反對票?這是一個基於一些位圖被改變的回調。它與UI無關。 – Patricia 2014-09-24 15:13:05

回答

5

你幾乎沒有。你只需要告訴你的pojo關於回調實例。首先,我強烈建議您將接口定義移入pojo中(因爲從概念上講,它必須對該對象執行的操作多於使用該活動的操作),或者將接口設置爲獨立類型。 pojo不應該知道客戶類(es)中定義的類型。

然後你有一個選擇:

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

在任何一種情況下,當位圖準備就緒時,您都有接線將位圖返回到活動。

編輯

這裏有一個如何這可能是結構化的例子。你沒有提供任何關於你如何創建pojo或調用處理的信息,所以我發明了一些例子。它假定處理過程是在一個單獨的線程中進行的,該線程完成後會回調該活動。您可以根據需要進行修改。 (具體而言,這可能是更簡單,如果POJO正在做的工作同步進行。此外,它會更好,使其與Activity生命週期正常交互使用一個AsyncTaskLoader而不是一個普通的線程。)

BitmapCallback.java

public interface BitmapCallback { 
    public void onBitmapReady(Bitmap processedBitmap); 
} 

MyActivity.java

public Activity 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.) 
      } 
     }); 
    } 
} 

ProcessImage.java

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(); 
    } 
} 
+0

首先,我想感謝您提供的信息。我仍然在爲此而苦苦掙扎。請參閱上面的問題末尾添加我的**更新**。 – Patricia 2014-09-24 16:08:09

+0

@Lucy - 你的邏輯倒退了。應該實現回調功能的是活動,而不是pojo。該功能的_definition_不應與活動的定義相關聯;否則pojo會對活動產生依賴,這是不可取的。我已經添加了一個具體的例子來說明我的意思。 – 2014-09-24 17:52:38

1

在你的POJO類

MyCallback callback; 

創建監聽器的實例,並設置onBitmapReady sendBitmap方法內通知活動

private void sendBitmap(Bitmap bitmap) { 
    // TODO - I'm in the pojo where I want to send the bitmap 
    callback.onBitmapReady(); 
} 
+0

這並不容易。該實例爲null,您不能實例化一個接口。當我終於明白這一點的時候,我會覺得現在甚至比我感覺到的還要笨拙。謝謝你的幫助。 – Patricia 2014-09-24 16:10:39

0

原來,爲了使回調的工作從裏面的意圖,我需要做回調序列化。嘗試後,繼續得到一個錯誤,反映出Activity以某種方式試圖序列化自己,這導致應用程序崩潰。

所以我回到了聰明的人泰德霍普。根據泰德的建議,我最終使用廣播。看到這裏的線程:how to use LocalBroadcastManager?

偉大的建議,特德,這解決了我的問題。

獲得的經驗:如果您嘗試使用SDK中的回調回到「外部」應用程序並遇到問題,請嘗試查看廣播。