【问题标题】:The simple one to make callback in android - AndroidX在android中进行回调的简单方法 - AndroidX
【发布时间】:2020-05-02 22:01:57
【问题描述】:

我试图弄清楚回调是如何工作的以及最简单的方法,但我无法解决它

这是我的监听器接口

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 :(");
    }
}

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

【问题讨论】:

  • 也许this 对你有用?

标签: java android callback listener


【解决方案1】:

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

您的代码的唯一问题是您过早地显示Toast,并且在调用Firebase 回调之前,所以在显示Toast 之后调用onTestingCBListener 的onSucess(),所以在侦听器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 正在后台线程中工作,因此需要一段时间才能将您的数据恢复到您的活动中。

【讨论】:

    【解决方案2】:

    按照以下步骤操作:

    1. 首先你必须让你的活动扩展回调接口,如:

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

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

      OnTestingCBListener onTestingCBListener;
      

      在 onCreate() 中像这样初始化它:

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

      onTestingCBListener.onSuccessCB(newToken);
      

    【讨论】:

    • 谢谢!!,初始化后问题解决了
    【解决方案3】:

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

    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 :(");
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2012-05-21
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多