我想用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)
}
答案 0 :(得分:1)
您应该为此MyFirebaseListener
创建自己的自定义监听器,并通过实现此界面
public interface MyFirebaseListener {
void onSuccess(DocumentReference documentReference)
void onFailure(Exception e)
}
现在将活动作为参数传递给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)
}
});
}
}
在“活动”中实施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
}
}
这可以完成广播接收器的工作,但上述解决方案最适合初学者...