Android - 将具有 Firebase 功能的侦听器排除在类之外

我想在 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)

   }


潇湘沐
浏览 143回答 3
3回答

海绵宝宝撒

您应该为此创建自己的自定义侦听器,MyFirebaseListener并通过实现此接口来更新您的活动内容public interface MyFirebaseListener {&nbsp; &nbsp; void onSuccess(DocumentReference documentReference)&nbsp; &nbsp; void onFailure(Exception e)}现在将Activity 作为参数传递给MyFirebaseListenertoaddNewUser()方法,如下所示public class UserApi{&nbsp; &nbsp; public void addNewUser(String firstname,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String lastname,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String email,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Integer gender,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String uid,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String profileImageUrl,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MyFirebaseListener myFirebaseListener){&nbsp; &nbsp; &nbsp; &nbsp; Map<String, Object> data = new HashMap<>();&nbsp; &nbsp; &nbsp; &nbsp; data.put("firstname", firstname);&nbsp; &nbsp; &nbsp; &nbsp; data.put("lastname", lastname);&nbsp; &nbsp; &nbsp; &nbsp; data.put("email", email);&nbsp; &nbsp; &nbsp; &nbsp; data.put("gender", gender);&nbsp; &nbsp; &nbsp; &nbsp; data.put("boxId", "independent");&nbsp; &nbsp; &nbsp; &nbsp; data.put("notificationsEnabled", true);&nbsp; &nbsp; &nbsp; &nbsp; data.put("profileImageUrl", profileImageUrl);&nbsp; &nbsp; &nbsp; &nbsp; mFirebaseFirestore.collection("usersP").add(data)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onSuccess(DocumentReference documentReference) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myFirebaseListener.onSuccess(documentReference)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .addOnFailureListener(new OnFailureListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onFailure(@NonNull Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myFirebaseListener.onFailure(e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }}MyFirebaseListener在您的 Activity 中实现接口,因此您需要覆盖以下方法并在这些实现的方法中执行UI 修改,如下所示public class MyActivity extends AppCompatActivity implements MyFirebaseListener {&nbsp; &nbsp; void someMethod(){&nbsp; &nbsp; &nbsp; &nbsp; addNewUser(firstname,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastname,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; email,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gender,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uid,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; profileImageUrl,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this) // <- This will be reference to Activity with Type of MyFirebaseListener&nbsp; &nbsp; }&nbsp; &nbsp; void onSuccess(DocumentReference documentReference){&nbsp; &nbsp; &nbsp; &nbsp; mProgressBar.setVisibility(View.GONE);&nbsp; &nbsp; &nbsp; &nbsp; mIRegisterActivity.inflateFragment("Register Box", mHashMap);&nbsp; &nbsp; &nbsp; &nbsp; Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId());&nbsp; &nbsp; }&nbsp; &nbsp; void onFailure(Exception e){&nbsp; &nbsp; &nbsp; &nbsp; Log.d(TAG, "Error adding document", e);&nbsp; &nbsp; }}这就是使用自定义接口分离 UI 逻辑和服务逻辑的方法

慕无忌1623718

您可以使用两种不同的方法......第一:你可以制作一个回调接口,就像我们在 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){&nbsp; &nbsp; &nbsp; &nbsp; Map<String, Object> data = new HashMap<>();&nbsp; &nbsp; &nbsp; &nbsp; data.put("firstname", firstname);&nbsp; &nbsp; &nbsp; &nbsp; data.put("lastname", lastname);&nbsp; &nbsp; &nbsp; &nbsp; data.put("email", email);&nbsp; &nbsp; &nbsp; &nbsp; data.put("gender", gender);&nbsp; &nbsp; &nbsp; &nbsp; data.put("boxId", "independent");&nbsp; &nbsp; &nbsp; &nbsp; data.put("notificationsEnabled", true);&nbsp; &nbsp; &nbsp; &nbsp; data.put("profileImageUrl", profileImageUrl);&nbsp; &nbsp; &nbsp; &nbsp; mFirebaseFirestore.collection("usersP").add(data)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onSuccess(DocumentReference documentReference) {mCallBackInterface.onSucuss(decumentReference);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .addOnFailureListener(new OnFailureListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onFailure(@NonNull Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.d(TAG, "Error adding document", e);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }}///The Class which will be calling it will be something like thisclass CallingClass implements CallBackInterface{@Overridevoid CallBackINterface(DocumentReference documentReference){//Your code goes here}}这将完成工作广播接收器也可以使用,但上述解决方案最适合初学者......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python