java - Android监听器/回调如何?

标签 java android callback listener

我有一个生成位图的 pojo 方法。完成后,我想将位图丢给 UI Activity 。这是一个示例,但在这里:

private void sendBitmap(Bitmap bitmap) {
    // TODO - I'm in the pojo where I want to send the bitmap
}

仅供引用:我要通知的 UI Activity 在我的项目之外。我的意思是,我的项目是一个 SDK,这样其他开发人员就会在信息可用时立即获取它。


我一直在努力解决这个问题,但有点困惑。

  1. 我需要一个“回调”接口(interface)吗?
  2. 或者“监听器”接口(interface)?
  3. 或者两者兼而有之?

我在 MyActivity 中创建了一个回调接口(interface)。到目前为止,一切都很好。这是到目前为止的样子:

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 可以实现我创建的回调接口(interface)。这是演示应用程序的 DoSomethingActivity 中回调的实现:

private final MyCallback myCallback = new MyCallback() {

    @Override
    public void onBitmapReady(Bitmap bitmap) {
        // TODO - do something with the bitmap
    }
};

我缺少通知回调的步骤是什么?也许我几乎明白了,但我很困惑,所以我正在这里寻找一点帮助。


更新:

好的,我已将回调“BitmapCallback”接口(interface)的“实现”添加到 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 中的回调接口(interface):

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。首先,我强烈建议您将接口(interface)定义移动到 POJO 中(因为从概念上讲,与您的 Activity 相比,它必须对该对象做更多的事情)或使接口(interface)成为一个独立的类型。 POJO 不应该知道客户端类中定义的类型。

然后你有一个选择:

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

无论哪种情况,当位图准备就绪时,您就可以通过连接将位图返回到 Activity 中。

编辑

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

BitmapCallback.java

public interface BitmapCallback {
    public void onBitmapReady(Bitmap processedBitmap);
}

MyActivity.java

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

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

关于java - Android监听器/回调如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26006360/

相关文章:

java - 如何添加-Xlint :unchecked option or any javac option in Eclipse?

android - 我想知道已从通话记录中删除的通话电话号码

Android 定义可在自定义启动器中使用的快捷方式

JavaScript json 回调

c++ - 将指针传递给成员函数

java - JPA:连接表语法

java - java中实现大量具有相似签名的方法的最佳设计模式是什么?

java - 如何同时运行ActionListener和KeyListener?

java - 如何在主 UI 线程之外运行 TimerTask?

javascript - 如何在异步库的 "Each"函数中定义回调?