java - null 对象引用上的 childEventListerer,Firebase 数据库

标签 java android firebase firebase-realtime-database firebaseui

在尝试使用 FirebaseRecyclerView 并遇到导致 populateViewHolder() 无法调用的问题时,我尝试了一种较旧的方法来检索 Firebase 数据库中 RecyclerView 的值。 但是我收到此错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.chris.storyboard/com.example.chris.storyboard.StoryPage}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.ChildEventListener com.google.firebase.database.DatabaseReference.addChildEventListener(com.google.firebase.database.ChildEventListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2984) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6776) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.ChildEventListener com.google.firebase.database.DatabaseReference.addChildEventListener(com.google.firebase.database.ChildEventListener)' on a null object reference at com.example.chris.storyboard.FirebaseHelper.retrieve(FirebaseHelper.java:51) at com.example.chris.storyboard.StoryPage.onCreate(StoryPage.java:98) at android.app.Activity.performCreate(Activity.java:6955) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)  at android.app.ActivityThread.-wrap14(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6776)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

我无法弄清楚为什么它将对象引用视为“null”,因为我在另一个工作正常的类中使用了类似的方法。

这是我的其余代码:

FirebaseHelper.class

public class FirebaseHelper{
DatabaseReference db = FirebaseDatabase.getInstance().getReference(); 
Boolean isSaved = null; 
ArrayList stories = new ArrayList<>(); 
FirebaseAuth firebaseAuth;

public FirebaseHelper(DatabaseReference db) {
    this.db = db;
}

public Boolean Saved(Stories stories) {
    if (stories == null) {
        isSaved = false;

    } else {
        try {
            db.child("Stories").push().setValue(stories);
            isSaved = true;

        } catch (DatabaseException e) {
            e.printStackTrace();
            isSaved = false;
        }
    }
    return isSaved;
}

public ArrayList<String> retrieve() {

    db.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Log.d("Testing: ", "Child added!");
           // fetchData(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Log.d("Testing: ", "Child changed!");
          //  fetchData(dataSnapshot);
        }


        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return stories;
}


private void fetchData(DataSnapshot datasnapshot) {
    stories.clear();
        String storyTitle = datasnapshot.child("storyTitle").getValue(String.class);
        stories.add(storyTitle);

    }


}

StoriesAdapter.class

public class StoriesAdapter extends RecyclerView.Adapter<StoriesHolder> {

Context c;
ArrayList<String> stories;

public StoriesAdapter(Context c, ArrayList<String> stories) {
    this.c = c;
    this.stories = stories;
}

@Override
public StoriesHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v= LayoutInflater.from(c).inflate(R.layout.customlistview,parent,false);

    return new StoriesHolder(v);
}

@Override
public void onBindViewHolder(StoriesHolder holder, int position) {
    holder.titletxtview.setText(stories.get(position));
    holder.cattxtview.setText(stories.get(position));
    holder.createdbytxtview.setText(stories.get(position));

}

@Override
public int getItemCount() {
    return stories.size();
}

StoriesHolder.class

public class StoriesHolder extends RecyclerView.ViewHolder {

TextView titletxtview;
TextView cattxtview;
TextView createdbytxtview;

public StoriesHolder(View itemView) {
    super(itemView);

    titletxtview = (TextView) itemView.findViewById(R.id.titleTxtView);
    cattxtview = (TextView) itemView.findViewById(R.id.cattxtview);
    createdbytxtview = (TextView) itemView.findViewById(R.id.createdbytxtview);
}

StoryPage.class

public class StoryPage extends AppCompatActivity {

Button homePage;
Button CreateStory;
Button logOut;
RecyclerView rv;
DatabaseReference db;
FirebaseHelper helper;
StoriesAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.storypage);
    this.setTitle("Browse stories");

    homePage = (Button) findViewById(R.id.homeBtn);
    CreateStory = (Button) findViewById(R.id.CreateStoryBtn);
    logOut = (Button) findViewById(R.id.logOutbtn);
    rv = (RecyclerView) findViewById(R.id.storyRecyclerView);
    rv.setLayoutManager(new LinearLayoutManager(this));
    helper = new FirebaseHelper(db);

    db = FirebaseDatabase.getInstance().getReference().child("Stories");


    homePage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(StoryPage.this, Home.class));
        }
    });

    CreateStory.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(StoryPage.this, CreateStory.class));
        }
    });

    homePage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            FirebaseAuth.getInstance().signOut();
            startActivity(new Intent(StoryPage.this, MainActivity.class));
        }
    });


    Query query = FirebaseDatabase.getInstance()
            .getReference()
            .child("Stories")
            .limitToLast(10);

    FirebaseRecyclerOptions<Stories> options =
            new FirebaseRecyclerOptions.Builder<Stories>()
                    .setQuery(query, Stories.class)
                    .build();

    adapter = new StoriesAdapter(this, helper.retrieve());
    rv.setAdapter(adapter);

}

“无法调用空对象引用”错误显示以下行

adapter = new StoriesAdapter(this, helper.retrieve());

 db.addChildEventListener(new ChildEventListener() {

开始觉得显示 RecyclerView 不符合我的观点!

非常感谢任何帮助!干杯

最佳答案

改变

helper = new FirebaseHelper(db);    
db = FirebaseDatabase.getInstance().getReference().child("Stories");

db = FirebaseDatabase.getInstance().getReference().child("Stories");
helper = new FirebaseHelper(db);   

当 db 对象为 null 时,您正在初始化 firebaseheper。这可以解决问题。

关于java - null 对象引用上的 childEventListerer,Firebase 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889234/

相关文章:

java - Couchdb:读取 Java 中的 View

android - 什么可能导致此 SQLite CursorWindowAllocationException?

java - 发生 Firebase 身份验证 FirebaseNetworkException : A network error (such as timeout, 中断连接或无法访问的主机)

android - Firebase 存储规则

java - 您可以在 map 值上指定泛型类型吗?

java - Spring数据库配置问题

java - 仅使用 Java 从 apk 中提取 AndroidManifest.xml 文件

java - 使所有按钮在 5 秒内不可点击

Firebase 自定义声明未在规则中更新

java - 在 Linux 服务器 Java 上找不到 json 文件路径