Самый простой, чтобы сделать обратный звонок в 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 :(");
    }
}

Это не работает, любое решение?

Всего 3 ответа


Следуй этим шагам:

  1. Сначала вы должны заставить свою деятельность расширять интерфейс обратного вызова, например:

    public class MainActivity extends AppCompatActivity(), OnTestingCBListener {
    
  2. Затем внедрите все не реализованные функции этого интерфейса в свою деятельность.

  3. Затем создайте объект этого интерфейса и инициализируйте его в onCreate () вашей Activity, например:

    OnTestingCBListener onTestingCBListener;
    

    в onCreate () инициализируем его так:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            onTestingCBListener = this
        }
    
  4. Затем вызывайте его функции, когда захотите:

    onTestingCBListener.onSuccessCB(newToken);
    

Пожалуйста, убедитесь, что журнал Log.d("newToken", "Success :)"); зарегистрирован в logcat, поэтому мы уверены, что onSuccessCB() локального прослушивателя onTestingCBListener запущен.

Единственная проблема с вашим кодом заключается в том, что вы показываете Toast слишком рано, и до того, как обратный вызов Firebase будет вызван, поэтому onSucess () onTestingCBListener вызывается после того, как ваш Toast показан, поэтому onSucess() сообщение Toast в слушатель onSucess() ; поэтому измените ниже часть вашего кода, чтобы быть

...
//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 работает в фоновом режиме, поэтому требуется время, чтобы вернуть ваши данные в вашу деятельность.


Проблема была решена, мне нужно сначала инициализировать слушателя

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