当前位置:  开发笔记 > 编程语言 > 正文

如何在Android中定义回调?

如何解决《如何在Android中定义回调?》经验,为你挑选了6个好方法。

在最近的Google IO期间,有一个关于实现restful客户端应用程序的演示文稿.不幸的是,这只是一个高级别的讨论,没有实现的源代码.

在此图中,在返回路径上有各种不同的回调到其他方法.

谷歌io演示幻灯片

我如何声明这些方法是什么?

我理解回调的想法 - 在某个事件发生后调用的一段代码,但我不知道如何实现它.到目前为止,我实现回调的唯一方法是覆盖各种方法(例如onActivityResult).

我觉得自己对设计模式有了基本的了解,但是我一直在探索如何处理返回路径.



1> EboMike..:

在许多情况下,您有一个接口并传递实现它的对象.例如,对话框具有OnClickListener.

就像一个随机的例子:

// The callback interface
interface MyCallback {
    void callbackCall();
}

// The class that takes the callback
class Worker {
   MyCallback callback;

   void onEvent() {
      callback.callbackCall();
   }
}

// Option 1:

class Callback implements MyCallback {
   void callbackCall() {
      // callback code goes here
   }
}

worker.callback = new Callback();

// Option 2:

worker.callback = new MyCallback() {

   void callbackCall() {
      // callback code goes here
   }
};

我可能搞砸了选项2中的语法.这是早期的.


掌握这种技术的一个很好的例子是片段如何通过它的共享活动与另一个片段进行通信:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
它表示worker类中的回调变量对我来说是空的

2> HGPB..:

当我的视图中发生某些事情时,我会触发我的活动正在侦听的事件:

//宣布(自定义)视图

    private OnScoreSavedListener onScoreSavedListener;
    public interface OnScoreSavedListener {
        public void onScoreSaved();
    }
    // ALLOWS YOU TO SET LISTENER && INVOKE THE OVERIDING METHOD 
    // FROM WITHIN ACTIVITY
    public void setOnScoreSavedListener(OnScoreSavedListener listener) {
        onScoreSavedListener = listener;
    }

//宣布参加活动

    MyCustomView slider = (MyCustomView) view.findViewById(R.id.slider)
    slider.setOnScoreSavedListener(new OnScoreSavedListener() {
        @Override
        public void onScoreSaved() {
            Log.v("","EVENT FIRED");
        }
    });

如果您想进一步了解片段之间的通信(回调),请参阅此处:http: //developer.android.com/guide/components/fragments.html#CommunicatingWithActivity



3> dragon..:

当您可以使用现有界面时,无需定义新界面:android.os.Handler.Callback.传递Callback类型的对象,并调用回调函数handleMessage(Message msg).



4> Amol Patil..:

使用interface实现回调方法的示例.

定义接口NewInterface.java.

package javaapplication1;

public interface NewInterface {
    void callback();
}

创建一个新类NewClass.java.它将在主类中调用回调方法.

package javaapplication1;

public class NewClass {

    private NewInterface mainClass;

    public NewClass(NewInterface mClass){
        mainClass = mClass;
    }

    public void calledFromMain(){
        //Do somthing...

        //call back main
        mainClass.callback();
    }
}

主类JavaApplication1.java,实现NewInterface接口 - callback()方法.它将创建并调用NewClass对象.然后,NewClass对象将依次回调它的callback()方法.

package javaapplication1;
public class JavaApplication1 implements NewInterface{

    NewClass newClass;

    public static void main(String[] args) {

        System.out.println("test...");

        JavaApplication1 myApplication = new JavaApplication1();
        myApplication.doSomething();

    }

    private void doSomething(){
        newClass = new NewClass(this);
        newClass.calledFromMain();
    }

    @Override
    public void callback() {
        System.out.println("callback");
    }

}



5> MrGnu..:

澄清一下龙的答案(因为我花了一些时间来弄清楚该怎么做Handler.Callback):

Handler可以用来通过传递它来在当前或另一个线程中执行回调Message.所述Message保持待从回调使用的数据.a Handler.Callback可以传递给构造函数,Handler以避免直接扩展Handler.因此,通过当前线程的回调执行一些代码:

Message message = new Message();


Callback callback = new Callback() {
    public boolean handleMessage(Message msg) {
        
    }
};

Handler handler = new Handler(callback);
handler.sendMessage(message);

编辑:刚刚意识到有一个更好的方法来获得相同的结果(减去对何时执行回调的确切控制):

post(new Runnable() {
    @Override
    public void run() {
        
    }
});



6> Rohit Mandiw..:

您也可以LocalBroadcast用于此目的.这是一个快速的问题

创建广播接收器:

   LocalBroadcastManager.getInstance(this).registerReceiver(
            mMessageReceiver, new IntentFilter("speedExceeded"));

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Double currentSpeed = intent.getDoubleExtra("currentSpeed", 20);
        Double currentLatitude = intent.getDoubleExtra("latitude", 0);
        Double currentLongitude = intent.getDoubleExtra("longitude", 0);
        //  ... react to local broadcast message
    }

这是你如何触发它

Intent intent = new Intent("speedExceeded");
intent.putExtra("currentSpeed", currentSpeed);
intent.putExtra("latitude", latitude);
intent.putExtra("longitude", longitude);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

onPause中的unRegister接收器:

protected void onPause() {
  super.onPause();
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有