我有一个生成Bitmap的pojo方法。完成后,我想将Bitmap抛出到UI活动。这是一个示例,但现在是:
private void sendBitmap(Bitmap bitmap) {
// TODO - I'm in the pojo where I want to send the bitmap
}
仅供参考:我想通知的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
}
};
我缺少通知回调的步骤是什么?也许我几乎拥有它,但我很困惑,我在这里寻求一些帮助。
更新
好的,我已经添加了"实现"我的回调" 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
}
};
叫我哑巴,但我很难理解这一点。
答案 0 :(得分:5)
你快到了。你只需要告诉你的pojo关于回调实例。首先,我强烈建议您将接口定义移动到pojo中(因为从概念上讲,它必须使用该对象而不是您的活动执行更多操作)或使接口成为独立类型。 pojo不应该知道客户端类中定义的类型。
然后你可以选择:
在任何一种情况下,当位图准备就绪时,你都可以通过接线将位图恢复到活动状态。
修改强>
以下是一个如何构建结构的示例。您没有提供有关如何创建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中的回调用于“外部”应用程序并遇到问题,请尝试查看“广播”。