Java Android侦听器/回调如何实现?
我有一个生成位图的pojo方法。完成后,我想将位图抛出到UI活动。这是一个示例,但在这里:Java Android侦听器/回调如何实现?,java,android,callback,listener,Java,Android,Callback,Listener,我有一个生成位图的pojo方法。完成后,我想将位图抛出到UI活动。这是一个示例,但在这里: private void sendBitmap(Bitmap bitmap) { // TODO - I'm in the pojo where I want to send the bitmap } public class ProcessImage implements BitmapCallback { /** * pojo method to return bitmap */ pri
private void sendBitmap(Bitmap bitmap) {
// TODO - I'm in the pojo where I want to send the bitmap
}
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.
}
仅供参考:我要通知的UI活动不在我的项目范围内。我的意思是,我的项目是一个SDK,因此,一旦该信息可用,其他开发人员就会立即获取该信息。
我一直想弄明白这一点,但有点困惑
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
}
};
public interface BitmapCallback {
public void onBitmapReady(Bitmap processedBitmapy);
}
我错过了通知回调的哪一步?也许我差点就拿到了,但我已经够糊涂了,我正在这里寻求帮助
更新: 好的,我已经在pojo中添加了回调“BitmapCallback”接口的“实现”。这是:
private void sendBitmap(Bitmap bitmap) {
// TODO - I'm in the pojo where I want to send the bitmap
}
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
}
};
叫我哑巴吧,但我很难理解这件事 在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();
}
你快到了。您只需要告诉您的
POJO
有关回调实例的信息。首先,我强烈建议您将接口定义移动到POJO
(因为从概念上讲,它与该对象的关系比与您的活动的关系更大),或者使接口成为独立的类型。POJO
不应该知道客户机类中定义的类型
那么你有一个选择:
POJO
中添加一个字段来存储回调实例(如果您希望支持回调多个侦听器,则可以添加更复杂的内容)和设置侦听器的方法。在创建或设置POJO
时,从活动(或任何适当的地方)调用该方法POJO
或调用处理的任何信息,因此我发明了一些东西作为示例。它假定处理是在一个单独的线程中进行的,该线程完成后将回调该活动。您可以根据需要对此进行修改。(特别是,如果POJO
同步执行工作,这可能会简单得多。此外,最好使用普通线程,而不是普通线程,以便它与活动
生命周期正确交互。)
BitmapCallback.java
public interface BitmapCallback {
public void onBitmapReady(Bitmap processedBitmap);
}
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.)
}
});
}
}
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();
}
}
MyActivity.java
public interface BitmapCallback {
public void onBitmapReady(Bitmap processedBitmap);
}
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.)
}
});
}
}
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();
}
}
ProcessImage.java
public interface BitmapCallback {
public void onBitmapReady(Bitmap processedBitmap);
}
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.)
}
});
}
}
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();
}
}
事实证明,为了使回调在意图内部工作,我需要使回调可序列化。尝试之后,继续得到一个错误,反映出活动试图序列化自身,这导致应用程序崩溃 所以我又回到了智者泰德·霍普那里。根据特德的建议,我最终使用了广播。请参见此处的线程: 很好的建议,特德,这解决了我的问题
经验教训:如果您试图使用从SDK回调回“外部”应用程序时遇到问题,请尝试查看广播。您查看的回调事件是什么?如果是单击事件,您应该查看OnClickListener,您可以在其中调用自定义侦听器。为什么投票被否决?这是基于正在更改的某些位图的回调。这与用户界面无关。首先,我要感谢您提供的信息。我仍在为此挣扎。请看我的更新添加到上面问题的末尾。@Lucy-你的逻辑颠倒了。应该实现回调功能的是活动,而不是pojo。该功能的定义不应与活动的定义挂钩;否则pojo将依赖于活动,这是不可取的。我添加了一个具体的例子来说明我的意思。这并不是那么容易。实例为null,不能实例化接口。当我最终得到这个,我会觉得比现在更愚蠢。谢谢你的帮助。