为何无法访问其他类的方法?Firebase取问题显示至TextView遇困
解决Firebase获取问题&跨类方法访问的问题
我来帮你搞定这个从Firebase拉取问题、在TextView显示,还有没法访问其他类方法的麻烦~先看你的GameManager代码,核心问题主要在Firebase异步加载的特性和方法访问权限/数据传递逻辑上,咱们一步步来调整:
首先,明确你代码里可能存在的问题
你原来的GameManager构造函数里直接调用getQuestions(),但Firebase的数据库操作是异步的——也就是说,你调用getQuestions()后,代码会继续往下走,不会等Firebase把数据拉完再执行,这时候其他类去拿listquestions可能是空的。另外,如果你的方法是private修饰的,其他类自然没法访问。
重构GameManager:加入回调机制处理异步数据
咱们给GameManager加个回调接口,这样数据加载完成后能及时通知调用的界面类,同时把需要外部访问的方法改成public:
public class GameManager { Context context; private ArrayList<MyQuestion> listquestions = new ArrayList<>(); private DatabaseReference mDatabase; private OnQuestionsLoadedListener listener; // 定义回调接口,用来通知数据加载结果 public interface OnQuestionsLoadedListener { void onQuestionsLoaded(ArrayList<MyQuestion> questions); void onLoadFailed(String error); } // 构造函数里传入回调监听 public GameManager(Context context, OnQuestionsLoadedListener listener) { this.context = context; this.listener = listener; getQuestions(); } private void getQuestions() { mDatabase = FirebaseDatabase.getInstance().getReference("questions"); mDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { listquestions.clear(); // 避免重复加载数据 for (DataSnapshot snapshot : dataSnapshot.getChildren()) { MyQuestion question = snapshot.getValue(MyQuestion.class); if (question != null) { listquestions.add(question); } } // 数据加载完成,通过回调把结果传出去 if (listener != null) { listener.onQuestionsLoaded(listquestions); } } @Override public void onCancelled(DatabaseError databaseError) { // 加载失败时通知调用者 if (listener != null) { listener.onLoadFailed(databaseError.getMessage()); } } }); } // 给外部类提供获取已加载问题列表的公开方法 public ArrayList<MyQuestion> getListQuestions() { return listquestions; } // 如果你有其他需要外部调用的方法,一定要用public修饰,比如: public MyQuestion getNextQuestion(int currentIndex) { if (currentIndex < listquestions.size() - 1) { return listquestions.get(currentIndex + 1); } return null; } }
在界面类(比如Activity)中调用并更新TextView
现在你可以在Activity/Fragment里实例化GameManager,通过回调拿到数据后更新你的TextView:
public class QuizActivity extends AppCompatActivity { private TextView questionTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz); questionTextView = findViewById(R.id.question_text); // 实例化GameManager并设置回调监听 new GameManager(this, new GameManager.OnQuestionsLoadedListener() { @Override public void onQuestionsLoaded(ArrayList<MyQuestion> questions) { // 数据加载成功,这里可以显示第一个问题(根据你的需求调整) if (!questions.isEmpty()) { MyQuestion firstQuestion = questions.get(0); // 假设MyQuestion类有getQuestionText()方法获取问题内容 questionTextView.setText(firstQuestion.getQuestionText()); } else { questionTextView.setText("暂无问题数据"); } } @Override public void onLoadFailed(String error) { // 处理加载失败的情况,比如显示错误提示 questionTextView.setText("加载问题失败:" + error); } }); } }
额外的排查点
- 确保你的
MyQuestion类字段和Firebase数据库里的字段名称完全一致,或者用@PropertyName注解做映射,不然Firebase解析数据会失败。 - 检查Firebase数据库的安全规则,确保你的App有读取
questions节点的权限,不然会加载失败。 - 所有需要外部类访问的方法,必须用
public修饰,不能是private或者默认的包访问权限。
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

