Android监听器/回调如何?

我有一个生成Bitmap的pojo方法。 完成后,我想将Bitmap抛出到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”接口添加了“implements”到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中移动回调定义,因为我希望客户的应用程序在其代码中实现回调,以便在将位图返回到客户的应用程序时处理该位图。

这是我的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而不是普通的vanilla线程,以便它与Activity生命周期正确交互。)

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

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

事实certificate,为了从一个意图内部进行回调工作,我需要进行回调Serializable。 尝试之后继续得到一个错误,反映出Activity正在尝试序列化自身,这导致应用程序崩溃。

所以我回到了全智者Ted Hopp。 根据泰德的建议,我最终使用了广播。 请参阅此处的主题: 如何使用LocalBroadcastManager?

伟大的建议,特德,这解决了我的问题。

获得的经验:如果您尝试将SDK中的回调用于“外部”应用程序并遇到问题,请尝试查看Broadcasting。