在 android 中进行回调的简单方法 - AndroidX

The simple one to make callback in android - AndroidX

我想弄清楚回调的工作原理和最简单的方法,但我无法解决它

这是我的监听器界面

public interface OnTestingCBListener {
     void onSuccessCB(String SomeValue);}

这是我的MainActivity.java

OnCreate(){
    //FIRST
    deviceSetup();
}

public void deviceSetup() {
    String DeviceID = "asdfg";
    final String[] FirebaseID = {""};

    //SECOND
    GetFireBaseIDCall(new OnTestingCBListener() {
        @Override
        public void onSuccessCB(String ResultValue) {
            //FOURTH
            FirebaseID[0] = ResultValue;
        }
    }, "Value1", "Value2");

    //FIFTH
    Toast.makeText(MainActivity.this, "Result: "+DeviceID+"#"+FirebaseID, Toast.LENGTH_LONG).show();
}

OnTestingCBListener onTestingCBListener;
public void GetFireBaseIDCall(OnTestingCBListener onTestingCBListener, String x, String y){
    if(x.equals("Value1") && y.equals("Value2")) {
        FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
            @Override
            public void onSuccess(InstanceIdResult instanceIdResult) {
                final String newToken = instanceIdResult.getToken();
                Log.d("newToken", "Success :)");

                //THIRD
                onTestingCBListener.onSuccessCB(newToken);
            }
        });

        Log.d("newToken", "Failed :(");
    }
}

不行,有什么解决办法吗?

请确保日志 Log.d("newToken", "Success :)"); 已登录 logcat 因此我们确定本地 onTestingCBListener 侦听器的 onSuccessCB() 已被触发。

您的代码的唯一问题是您过早显示 Toast,并且在 Firebase 回调被调用之前,因此 onTestingCBListener 的 onSucess() 得到在您的 Toast 显示后调用,因此在监听器 onSucess() 中传输 Toast 消息;所以将下面的部分代码更改为

...
//SECOND
GetFireBaseIDCall(new OnTestingCBListener() {
    @Override
    public void onSuccessCB(String ResultValue) {
        //FOURTH
        FirebaseID[0] = ResultValue;
        //FIFTH
        Toast.makeText(MainActivity.this, "Result: "+DeviceID+"#"+FirebaseID, Toast.LENGTH_LONG).show();
    }
}, "Value1", "Value2");
... 

另请注意,Firebase 正在后台线程中工作,因此需要一段时间才能将数据返回到 activity。

按照以下步骤操作:

  1. 首先,您必须 activity 扩展回调接口,例如:

    public class MainActivity extends AppCompatActivity(), OnTestingCBListener {
    
  2. 然后在您的 activity 中实现该接口的所有未实现功能。

  3. 然后创建该接口的对象并在 Activity 的 onCreate() 中初始化它,例如:

    OnTestingCBListener onTestingCBListener;
    

    在 onCreate() 中将其初始化为:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            onTestingCBListener = this
        }
    
  4. 然后随时调用它的函数,例如:

    onTestingCBListener.onSuccessCB(newToken);
    

问题已解决,需要先初始化监听器

final OnTestingCBListener onTestingCBListener;
    public void GetFireBaseIDCall(OnTestingCBListener onTestingCBListener, String x, String y){
        if(x.equals("Value1") && y.equals("Value2")) {
            FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
                @Override
                public void onSuccess(InstanceIdResult instanceIdResult) {
                    final String newToken = instanceIdResult.getToken();
                    Log.d("newToken", "Success :)");


                    //This is the problem!!
                    onTestingCBListener = onTestingCBListener;
                    //THIRD
                    onTestingCBListener.onSuccessCB(newToken);
                }
            });

            Log.d("newToken", "Failed :(");
        }
    }