2014-09-23 75 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中的回调回到“外部”应用程序并遇到问题,请尝试查看广播。