java - 如何重用不同类中的方法

标签 java android firebase code-reuse

我有一个authenticateID方法,它在数据库中搜索以查找匹配项并执行某些操作。我想解释起来需要很长时间,所以这是我的代码:

public boolean authenticateStudentID() {

    boolean success = true;

    final String studentID = etStudentID.getText().toString().trim();
    final String module = etModule.getText().toString().trim();
    final String degree = etDegree.getText().toString().trim();
    final String room = etRoom.getText().toString().trim();
    final String email = etEmail.getText().toString().trim();
    final String fullname = etfullname.getText().toString().trim();
    final String loginID = etLoginID.getText().toString().trim();

    if (success) {
        databaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // wtf is this advanecd for loop
                    //map string string because our key is a string and value is a string, map has a key and value object
                    Map<String, String> map = (Map) snapshot.getValue();
                    if (map != null) { //if the values and keys are not null
                        String studentIDMatch = map.get("studentID");

                      //  Log.v("E_VALUE", "students ID entered : " + studentIDMatch);
                      //  Log.v("E_VALUE", "students ID from db: " + studentID);
                        if (studentID.equals(studentIDMatch)) {
                            String uniqueKey = databaseRef.push().getKey();

                            NewStudentAccounts sam = new NewStudentAccounts
                                    (studentID, loginID, email, fullname, module, degree, room);

                            databaseRef.child(uniqueKey).setValue(sam);

                            Toast.makeText(getApplicationContext(), "Your account registration has been successful!", Toast.LENGTH_SHORT).show();
                            startActivity(new Intent(getApplicationContext(), LoginActivity.class));
                        } else {
                            Toast.makeText(getApplicationContext(), "Invalid Student Credentials Entered!!", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }
    return success;

我想知道如何在另一个类中重用此方法,而不是复制和粘贴代码。请指导我,我真的很感激。

private void addNewStudent() {

    findViewById(R.id.buttonAddStudent).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            View addStudentActivityDialog = LayoutInflater.from(LecturerAccount.this).inflate(R.layout.activity_add_student,null);

            etStudentName = addStudentActivityDialog.findViewById(R.id.editTextStudentName);
            etStudentUserID = addStudentActivityDialog.findViewById(R.id.editTextStudentUserID);

            AlertDialog.Builder addStudentBuilder = new AlertDialog.Builder(LecturerAccount.this);

            addStudentBuilder.setMessage("STAR").setView(addStudentActivityDialog).setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    String studentName = etStudentName.getText().toString();
                    String studentID = etStudentUserID.getText().toString();

                    registerActivity = new RegisterActivity(); //calling the instance of the class here

                    if (registerActivity.authenticateStudentID() == true){
                        studentarray.add(studentName);
                    }

                }
            }).setNegativeButton("cancel", null).setCancelable(false);
            AlertDialog newStudentDialog = addStudentBuilder.create();
            newStudentDialog.show();
        }
    });

}

我的 if 语句在这里调用函数,我在这里完全一无所知。

最佳答案

由于 onDataChange(DataSnapshot dataSnapshot) 是来自 firebase 的异步回调事件,因此您必须实现自己的回调方法才能收到结果通知。

一种方法是使用接口(interface)。

创建一个单独的类 Auth

public class Auth {

public static void authenticateStudentID(final String studentID, final AuthListener listener) {

    DatabaseReference databaseRef = FirebaseDatabase.getInstance().getReference("your reference");

    databaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // wtf is this advanecd for loop
                //map string string because our key is a string and value is a string, map has a key and value object
                Map<String, String> map = (Map) snapshot.getValue();
                if (map != null) { //if the values and keys are not null
                    String studentIDMatch = map.get("studentID");

                    if (studentID.equals(studentIDMatch)) {

                        if (listener != null)
                            listener.onAuthSuccess();


                    } else {

                        if (listener != null)
                            listener.onAuthFailure();
                    }
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            if (listener != null)
                listener.onAuthFailure();
        }
    });
}

public interface AuthListener {
    void onAuthSuccess();

    void onAuthFailure();
}

}

然后通过

调用它
Auth.authenticateStudentID(studentId, new Auth.AuthListener() {
        @Override
        public void onAuthSuccess() {

        }

        @Override
        public void onAuthFailure() {

        }
    });

任何需要的地方

关于java - 如何重用不同类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48046721/

相关文章:

java - 我的程序中的数组似乎有什么问题? [Java 数组(练习)]

java - GSON - 1 个 parent ,多个 child

java - 声音不会播放两次

java - 如何为Firebase数据库设置 protected "write"规则?

java - 将类转换为接口(interface)

java - 如何在不覆盖的情况下将数据推送到 firebase

java - 在Java中对对象数组进行冒泡排序

android - Android Studio 中窗口类型 2002 的权限被拒绝

javascript - 为什么 "this"在回调函数中变为null?

ios - 如何在 Firebase 中更新新项目