Android监听器/回调如何?

时间:2014-09-23 23:42:20

标签: java android callback listener

我有一个生成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. 或两者兼而有之?
  4. 我在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          
        }
    };
    

    叫我哑巴,但我很难理解这一点。

3 个答案:

答案 0 :(得分:5)

你快到了。你只需要告诉你的pojo关于回调实例。首先,我强烈建议您将接口定义移动到pojo中(因为从概念上讲,它必须使用该对象而不是您的活动执行更多操作)或使接口成为独立类型。 pojo不应该知道客户端类中定义的类型。

然后你可以选择:

  1. 使用一个监听器模式:在你的pojo中添加一个字段来存储一个回调实例(或者如果你想支持回调多个监听器则更复杂)和一个设置监听器的方法。在创建或设置pojo时,从您的活动(或任何适当的地方)调用该方法。
  2. 使用回调模式:使用回调参数增强相关的API方法。
  3. 在任何一种情况下,当位图准备就绪时,你都可以通过接线将位图恢复到活动状态。

    修改

    以下是一个如何构建结构的示例。您没有提供有关如何创建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();
        }
    }
    

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

所以我回到了全明智的人,特德霍普。根据泰德的建议,我最终使用了广播。请参阅此处的主题:how to use LocalBroadcastManager?

很好的建议,特德,这解决了我的问题。

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