Android-将带有Firebase功能的侦听器置于类之外

时间:2018-07-18 05:38:00

标签: java android firebase google-cloud-firestore

我想用MVC编写我的应用程序。问题是我是Android新手,如果函数不在主类之外,我也不知道如何拥有listener / callback

public void addNewUser(String firstname, String lastname, String email, Integer gender, String uid, String profileImageUrl){

        Map<String, Object> data = new HashMap<>();
        data.put("firstname", firstname);
        data.put("lastname", lastname);
        data.put("email", email);
        data.put("gender", gender);
        data.put("boxId", "independent");
        data.put("notificationsEnabled", true);
        data.put("profileImageUrl", profileImageUrl);

        mFirebaseFirestore.collection("usersP").add(data)
                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
                        mProgressBar.setVisibility(View.GONE);

                        mIRegisterActivity.inflateFragment("Register Box", mHashMap);
                        Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId());
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d(TAG, "Error adding document", e);
                    }
                });

    }

我想在另一个Java类中使用此功能。但是,如果这样做,我不知道如何仅在函数完成执行后才可以启动动作->换句话说,当函数为addOnSuccessListener时。

你知道我该怎么做吗?

我习惯于快速编码,就像这样:

func addUser(id: String, completion: @escaping (User) -> Void) {
      // Code and then
      completion(user)
   }

5 个答案:

答案 0 :(得分:1)

您应该为此MyFirebaseListener创建自己的自定义监听器,并通过实现此界面

来更新活动中的内容
public interface MyFirebaseListener {
    void onSuccess(DocumentReference documentReference)
    void onFailure(Exception e)
}

现在将活动作为参数传递给MyFirebaseListeneraddNewUser()方法,如下所示

public class UserApi{

    public void addNewUser(String firstname, 
                String lastname, 
                String email, 
                Integer gender, 
                String uid, 
                String profileImageUrl,
                MyFirebaseListener myFirebaseListener){

        Map<String, Object> data = new HashMap<>();
        data.put("firstname", firstname);
        data.put("lastname", lastname);
        data.put("email", email);
        data.put("gender", gender);
        data.put("boxId", "independent");
        data.put("notificationsEnabled", true);
        data.put("profileImageUrl", profileImageUrl);

        mFirebaseFirestore.collection("usersP").add(data)
                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
                        myFirebaseListener.onSuccess(documentReference)
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        myFirebaseListener.onFailure(e)
                    }
                });

    }
}

在“活动”中实施MyFirebaseListener界面,因此您需要覆盖以下方法,并在以下实现的方法中执行 UI修改

public class MyActivity extends AppCompatActivity implements MyFirebaseListener {

    void someMethod(){
        addNewUser(firstname, 
                lastname, 
                email, 
                gender,
                uid,
                profileImageUrl,
                this) // <- This will be reference to Activity with Type of MyFirebaseListener
    }

    void onSuccess(DocumentReference documentReference){
        mProgressBar.setVisibility(View.GONE);
        mIRegisterActivity.inflateFragment("Register Box", mHashMap);
        Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId());
    }
    void onFailure(Exception e){
        Log.d(TAG, "Error adding document", e);
    }
}

这是您可以使用自定义界面 分隔 UI逻辑和服务逻辑的方法

答案 1 :(得分:0)

请参阅以下链接以获取自定义侦听器: https://guides.codepath.com/android/Creating-Custom-Listeners

如果您想让监听器始终保持通话状态, 对于Firebase侦听器,将应用程序类用于侦听器。

如果要将方法设为全局(需要Firebase响应的方法),请将其放在Application类中,或使用 BroadcastReceiver Listener EventBus < / strong>。

如果有任何疑问,请在这里评论。

答案 2 :(得分:0)

只需添加一个接口...

public interface IFirebaseTask {
    void OnSuccess(DocumentReference reference);
    void OnFailure(Exception e);
}

然后实现该接口,可能需要在其中侦听:

public SomeActivity extends FragmentActivity implements IFirebaseTask {

}

还可以将侦听器传递给构造函数:

public SomeFirebaseTask(Context context, IFirebaseTask listener){
    this.setContext(context);
    this.listener = listener;
}

...以便从其他地方通知上面定义的侦听器。

或者,可以让任何类实现接口方法:

... implements OnSuccessListener<DocumentReference>, OnFailureListener

,然后将监听器完全绑定:

mFirebaseFirestore
  .collection("usersP")
  .add(data)
  .addOnSuccessListener(SomeActivity.this)
  .addOnFailureListener(SomeActivity.this);

Firebase文档(以防有人打扰)也得到了答案...

请参阅第Detaching Callbacks节。

答案 3 :(得分:0)

首先添加listenerInterface

public interface FirebaseResponse {
     void onSuccess();
     void onFailure();
}

像下面一样创建单独的类

public class ResponseHandler implements
    OnSuccessListener<DocumentReference>() , OnFailureListener() {

            private FirebaseListener listener;

            public ResponseHandler(FirebaseListener listener){
                 this.listener = listener;
            }     


             @Override
             public void onSuccess(DocumentReference documentReference) {
              //Todo handle onSuccess
                 listener.onSuccess();
             }

             @Override
             public void onFailure(@NonNull Exception e) {
                //Todo handle onFailure
                 listener.onFailure();
             }
    }

然后将此类添加为实现FirebaseListener的类中的响应处理程序

ResponseHandler responseHandler = new ResponseHandler(this);

mFirestore.collection("usersP").add(data)
                .addOnSuccessListener(responseHandler).
                .addOnFailureListener(responseHandler)

答案 4 :(得分:0)

您可以使用两种不同的方法... 第一: 您可以像创建RecyclerView点击回调一样创建回调接口。

第二: 如果您必须对rxJava2,arch life或Agera有一点了解,那么您可以使用livedata观察器。

所以让我们考虑第一个方法

考虑您的课程是

class otherClass{
callbackInterface mCallBackInterface;

public(callbackInterface mCallBackInterface){
this.mCallBackInterface=mCallBackInterface;
}

interface callbackInterface{
void onSucuss(DocumentReference documentReference);
}


public void addNewUser(String firstname, String lastname, String email, Integer gender, String uid, String profileImageUrl){

        Map<String, Object> data = new HashMap<>();
        data.put("firstname", firstname);
        data.put("lastname", lastname);
        data.put("email", email);
        data.put("gender", gender);
        data.put("boxId", "independent");
        data.put("notificationsEnabled", true);
        data.put("profileImageUrl", profileImageUrl);

        mFirebaseFirestore.collection("usersP").add(data)
                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {

mCallBackInterface.onSucuss(decumentReference);


                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d(TAG, "Error adding document", e);
                    }
                });

    }

}

///The Class which will be calling it will be something like this

class CallingClass implements CallBackInterface{

@Override
void CallBackINterface(DocumentReference documentReference){

//Your code goes here
}

}

这可以完成广播接收器的工作,但上述解决方案最适合初学者...