首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android侦听器/回调如何?

问Android侦听器/回调如何?
EN

Stack Overflow用户
提问于 2014-09-23 23:42:20
回答 3查看 16.5K关注 0票数 3

我有一个生成位图的pojo方法。完成后,我希望将位图抛到UI活动中。这是一个样本,但这里是:

代码语言:javascript
复制
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中创建了一个回调接口。到现在为止还好。到目前为止,情况是这样的:

代码语言:javascript
复制
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中回调的实现:

代码语言:javascript
复制
private final MyCallback myCallback = new MyCallback() {

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

通知回调的步骤是什么?也许我差点就有了,但我很困惑,所以我在这里找人帮忙。

更新:

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

代码语言:javascript
复制
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活动中移动,因为我希望客户的应用程序在他们的代码中实现回调,以便在将其返回给客户的应用程序时处理位图。

下面是我活动中的回调接口:

代码语言:javascript
复制
public interface BitmapCallback {

    public void onBitmapReady(Bitmap processedBitmapy);
}

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

代码语言:javascript
复制
private final BitmapCallback bitmapCallback = new BitmapCallback()  
{

    @Override
    public void onBitmapReady(Bitmap bitmap) {
        // TODO Auto-generated method stub          
    }
};

说我傻,但我很难想清楚这件事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-23 23:53:25

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

那么你可以选择:

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

在任何一种情况下,当位图准备就绪时,您就有了将位图返回到活动的连线。

编辑

这里有一个例子,说明了如何构建这个结构。您还没有提供任何关于如何创建POJO或调用处理的信息,因此我仅举一个例子。它假定处理是在一个单独的线程中进行的,完成后该线程将调用该活动。您可以根据需要对此进行修改。(特别是,如果POJO同步地执行这项工作,这可能要简单得多。另外,最好使用AsyncTaskLoader,而不是普通的普通线程,这样它就可以与Activity生命周期进行适当的交互。)

BitmapCallback.java

代码语言:javascript
复制
public interface BitmapCallback {
    public void onBitmapReady(Bitmap processedBitmap);
}

MyActivity.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
    }
}
票数 7
EN

Stack Overflow用户

发布于 2014-09-23 23:53:23

在pojo类中创建侦听器实例

代码语言:javascript
复制
MyCallback callback;

并将onBitmapReady在sendBitmap方法中设置为通知活动

代码语言:javascript
复制
private void sendBitmap(Bitmap bitmap) {
    // TODO - I'm in the pojo where I want to send the bitmap
    callback.onBitmapReady();
}
票数 1
EN

Stack Overflow用户

发布于 2014-09-25 14:01:18

原来,为了使回调从内部开始工作,我需要使回调可序列化。在尝试之后,并继续得到一个错误,反映出该活动正试图序列化自己,这导致应用程序崩溃。

所以我回到了最聪明的那个泰德·霍普。根据泰德的建议,我最终使用了广播公司。参见此处的线程:how to use LocalBroadcastManager?

好建议泰德这解决了我的问题。

的经验教训:如果您试图使用SDK的回调返回到“外部”应用程序,并且有问题,请尝试查看一下广播。。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26006360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档