Самый простой способ сделать обратный вызов в android - AndroidX - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь выяснить, как работает обратный вызов и как проще всего это сделать, но я не могу решить его

Это мой интерфейс слушателя

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 ]

2 голосов
/ 16 января 2020

Выполните следующие действия:

  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);
    
1 голос
/ 16 января 2020

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

Единственная проблема с вашим кодом заключается в том, что вы показ Toast слишком рано и до того, как будет вызван обратный вызов Firebase, поэтому onSucess () вызывается в onTestingCBListener после показа вашего Toast, поэтому передайте сообщение 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 работает в фоновом режиме, поэтому требуется время, чтобы вернуть ваши данные в вашу деятельность.

0 голосов
/ 16 января 2020

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

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