簡體   English   中英

Android-將帶有Firebase功能的偵聽器置於類之外

[英]Android - Keep Listener with Firebase function out of the class

我想用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)
   }

您應該為自己的 MyFirebaseListener創建自定義監聽器 ,並通過實現此接口來更新活動中的內容

public interface MyFirebaseListener {
    void onSuccess(DocumentReference documentReference)
    void onFailure(Exception e)
}

現在,將Activity作為參數傳遞給MyFirebaseListener以使用addNewUser()方法,如下所示

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)
                    }
                });

    }
}

在您的Activity中實現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邏輯和服務邏輯的方法

請參閱此鏈接以獲取自定義偵聽器: https : //guides.codepath.com/android/Creating-Custom-Listeners

如果要始終保持偵聽器調用,對於Firebase偵聽器,請對偵聽器使用應用程序類

如果您想要全局方法(需要Firebase響應的方法),則將該函數放在Application類中,或者使用BroadcastReceiverListenerEventBus

如果您有任何疑問,請在這里評論。

只需添加一個界面...

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文檔(以防有人不願閱讀)也有此答案...

請參閱“ 分離回調”部分。

首先添加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)

您可以使用兩種不同的方法...首先:您可以像在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
}

}

這將做工作廣播接收器也可以使用,但以上解決方案最適合初學者...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM