Java Android侦听器/回调如何实现?

Java Android侦听器/回调如何实现?,java,android,callback,listener,Java,Android,Callback,Listener,我有一个生成位图的pojo方法。完成后,我想将位图抛出到UI活动。这是一个示例,但在这里: private void sendBitmap(Bitmap bitmap) { // TODO - I'm in the pojo where I want to send the bitmap } public class ProcessImage implements BitmapCallback { /** * pojo method to return bitmap */ pri

我有一个生成位图的pojo方法。完成后,我想将位图抛出到UI活动。这是一个示例,但在这里:

private void sendBitmap(Bitmap bitmap) {
    // TODO - I'm in the pojo where I want to send the bitmap
}
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.

}
仅供参考:我要通知的UI活动不在我的项目范围内。我的意思是,我的项目是一个SDK,因此,一旦该信息可用,其他开发人员就会立即获取该信息。


我一直想弄明白这一点,但有点困惑

  • 我需要一个“回调”接口吗
  • 还是“侦听器”接口
  • 或者两者都有
  • 我在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
        }
    };
    
    public interface BitmapCallback {
    
        public void onBitmapReady(Bitmap processedBitmapy);
    }
    
    我错过了通知回调的哪一步?也许我差点就拿到了,但我已经够糊涂了,我正在这里寻求帮助


    更新:

    好的,我已经在pojo中添加了回调“BitmapCallback”接口的“实现”。这是:

    private void sendBitmap(Bitmap bitmap) {
        // TODO - I'm in the pojo where I want to send the bitmap
    }
    
    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          
        }
    };
    

    叫我哑巴吧,但我很难理解这件事

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

    你快到了。您只需要告诉您的
    POJO
    有关回调实例的信息。首先,我强烈建议您将接口定义移动到
    POJO
    (因为从概念上讲,它与该对象的关系比与您的活动的关系更大),或者使接口成为独立的类型。
    POJO
    不应该知道客户机类中定义的类型

    那么你有一个选择:

  • 使用侦听器模式:在您的
    POJO
    中添加一个字段来存储回调实例(如果您希望支持回调多个侦听器,则可以添加更复杂的内容)和设置侦听器的方法。在创建或设置
    POJO
    时,从活动(或任何适当的地方)调用该方法
  • 使用回调模式:使用回调参数增强相关API方法
  • 在任何一种情况下,当位图准备就绪时,您都可以将位图连接回活动

    编辑

    下面是一个如何构建的示例。您没有提供关于如何创建
    POJO
    或调用处理的任何信息,因此我发明了一些东西作为示例。它假定处理是在一个单独的线程中进行的,该线程完成后将回调该活动。您可以根据需要对此进行修改。(特别是,如果
    POJO
    同步执行工作,这可能会简单得多。此外,最好使用普通线程,而不是普通线程,以便它与
    活动
    生命周期正确交互。)

    BitmapCallback.java

    public interface BitmapCallback {
        public void onBitmapReady(Bitmap processedBitmap);
    }
    
    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();
        }
    }
    
    MyActivity.java

    public interface BitmapCallback {
        public void onBitmapReady(Bitmap processedBitmap);
    }
    
    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();
        }
    }
    
    ProcessImage.java

    public interface BitmapCallback {
        public void onBitmapReady(Bitmap processedBitmap);
    }
    
    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();
        }
    }
    

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

    所以我又回到了智者泰德·霍普那里。根据特德的建议,我最终使用了广播。请参见此处的线程:

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


    经验教训:如果您试图使用从SDK回调回“外部”应用程序时遇到问题,请尝试查看广播。

    您查看的回调事件是什么?如果是单击事件,您应该查看OnClickListener,您可以在其中调用自定义侦听器。为什么投票被否决?这是基于正在更改的某些位图的回调。这与用户界面无关。首先,我要感谢您提供的信息。我仍在为此挣扎。请看我的更新添加到上面问题的末尾。@Lucy-你的逻辑颠倒了。应该实现回调功能的是活动,而不是pojo。该功能的定义不应与活动的定义挂钩;否则pojo将依赖于活动,这是不可取的。我添加了一个具体的例子来说明我的意思。这并不是那么容易。实例为null,不能实例化接口。当我最终得到这个,我会觉得比现在更愚蠢。谢谢你的帮助。