Android监听器/回调如何?

Pat*_*cia 2 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
}
Run Code Online (Sandbox Code Playgroud)

仅供参考:我想要通知的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

演示应用程序的DoSomethingActivity可以实现我创建的回调接口.这是演示应用程序的DoSomethingActivity中回调的实现:

private final MyCallback myCallback = new MyCallback() {

    @Override
    public void onBitmapReady(Bitmap bitmap) {
        // TODO - do something with the bitmap
    }
};
Run Code Online (Sandbox Code Playgroud)

通知回调的步骤是什么?也许我几乎拥有它,但我很困惑,我在这里寻求一些帮助.


更新:

好的,我已经为我的回调"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.

}
Run Code Online (Sandbox Code Playgroud)

我无法从SDK活动中移动回调定义,因为我希望客户的应用程序在其代码中实现回调,以便在将位图返回到客户的应用程序时处理该位图.

这是我的Activity中的回调接口:

public interface BitmapCallback {

    public void onBitmapReady(Bitmap processedBitmapy);
}
Run Code Online (Sandbox Code Playgroud)

以下是客户应用程序中的实现:

private final BitmapCallback bitmapCallback = new BitmapCallback()  
{

    @Override
    public void onBitmapReady(Bitmap bitmap) {
        // TODO Auto-generated method stub          
    }
};
Run Code Online (Sandbox Code Playgroud)

叫我笨,但我很难理解这一点.

Ted*_*opp 6

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

然后你有一个选择:

  1. 使用一个监听器模式:在你的pojo中添加一个字段来存储一个回调实例(或者如果你想支持回调多个监听器则更复杂)和一个设置监听器的方法.在创建或设置pojo时,从您的活动(或适当的任何地方)调用该方法.
  2. 使用回调模式:使用回调参数增强相关的API方法.

在任何一种情况下,当位图准备就绪时,您都可以通过接线将位图恢复到活动状态.

编辑

这是一个如何构建它的示例.您没有提供有关如何创建pojo或调用处理的任何信息,所以我发明了一些例子.它假定处理发生在一个单独的线程中,完成后将回调该活动.您可以根据需要进行修改.(特别是,如果pojo同步进行工作,这可能会更简单.另外,最好使用AsyncTaskLoader一个普通的而不是普通的线程,以便它与Activity生命周期正确地交互.)

BitmapCallback.java

public interface BitmapCallback {
    public void onBitmapReady(Bitmap processedBitmap);
}
Run Code Online (Sandbox Code Playgroud)

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.)
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)