我有一个生成位图的pojo方法。完成后,我希望将位图抛到UI活动中。这是一个样本,但这里是:
private void sendBitmap(Bitmap bitmap) {
// TODO - I'm in the pojo where I want to send the bitmap
}FYI:我想通知的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
}
};通知回调的步骤是什么?也许我差点就有了,但我很困惑,所以我在这里找人帮忙。
更新:
好的,我已经在pojo中添加了回调"BitmapCallback“接口的”实现“。下面是:
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
}
};说我傻,但我很难想清楚这件事。
发布于 2014-09-23 23:53:25
你快到了。您只需要告诉您的POJO有关回调实例。首先,我强烈建议您将接口定义移动到POJO中(因为从概念上讲,它必须对该对象做更多的工作,而不是使用您的活动),或者使接口成为一个独立的类型。POJO不应该知道在客户端类(Es)中定义的类型。
那么你可以选择:
POJO中添加一个字段来存储回调的实例(如果您希望支持对多个侦听器的调用,则存储更复杂的实例)和设置侦听器的方法。在创建或正在设置POJO时,从活动(或适当的地方)调用该方法。在任何一种情况下,当位图准备就绪时,您就有了将位图返回到活动的连线。
编辑
这里有一个例子,说明了如何构建这个结构。您还没有提供任何关于如何创建POJO或调用处理的信息,因此我仅举一个例子。它假定处理是在一个单独的线程中进行的,完成后该线程将调用该活动。您可以根据需要对此进行修改。(特别是,如果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();
}
}发布于 2014-09-23 23:53:23
在pojo类中创建侦听器实例
MyCallback callback;并将onBitmapReady在sendBitmap方法中设置为通知活动
private void sendBitmap(Bitmap bitmap) {
// TODO - I'm in the pojo where I want to send the bitmap
callback.onBitmapReady();
}发布于 2014-09-25 14:01:18
原来,为了使回调从内部开始工作,我需要使回调可序列化。在尝试之后,并继续得到一个错误,反映出该活动正试图序列化自己,这导致应用程序崩溃。
所以我回到了最聪明的那个泰德·霍普。根据泰德的建议,我最终使用了广播公司。参见此处的线程:how to use LocalBroadcastManager?
好建议泰德这解决了我的问题。
的经验教训:如果您试图使用SDK的回调返回到“外部”应用程序,并且有问题,请尝试查看一下广播。。
https://stackoverflow.com/questions/26006360
复制相似问题