因此,在我的 onCreate() 方法中,我调用 Parse 查询并返回绑定(bind)到全局变量的单个 ParseObject,如下所示...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
String quizId = getActivity().getIntent().getStringExtra("quizId");
ParseQuery<ParseObject> getQuiz = ParseQuery.getQuery("Quiz");
getQuiz.getInBackground(quizId, new GetCallback<ParseObject>() {
@Override
public void done(ParseObject result, ParseException e) {
mQuiz = result;
mQuestionRelation = mQuiz.getRelation("questions");
Log.d("KMH", "mQuiz: " + mQuiz.getObjectId());
}
});
}
}
控制台返回此作为它正在获取对象的证据:
11-19 03:12:40.104 14876-14876/com.codejunkie.games.quizie D/KMH﹕ Parse returned quiz: HTgGeY3NJL
然后,我将全局 ParseRelation 变量设置为返回的 ParseObject 的关系。现在,在我的 onResume() 方法中,我使用了 Relation 全局变量,并且它收到了 NullPointerException
。
@Override
public void onResume() {
super.onResume();
ParseQuery<ParseObject> getAnswers = mQuestionRelation.getQuery();
getAnswers.addDescendingOrder("createdAt");
getAnswers.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> answers, ParseException e) {
mAnswers = answers;
String[] answerText = new String[mAnswers.size()];
int i = 0;
for(ParseObject answer : mAnswers) {
answerText[i] = answer.getString("answer");
i++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout._item_question, R.id.questionText, answerText);
setListAdapter(adapter);
}
});
}
这是带有NullPointer
的行:
ParseQuery<ParseObject> getAnswers = mQuestionRelation.getQuery();
答案:
由于对 Parse 的 .getInBackground 调用,我没有在主线程中设置全局变量。这是我修复它的方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
String quizId = getActivity().getIntent().getStringExtra("quizId");
ParseQuery<ParseObject> getQuiz = ParseQuery.getQuery("Quiz");
try {
mQuiz = getQuiz.get(quizId);
mQuestionRelation = mQuiz.getRelation("questions");
} catch (ParseException e) {
e.printStackTrace();
}
}
}
并处理 mQuestionRelation 为 null
的情况:
if (mQuestionRelation != null) {
ParseQuery<ParseObject> getQuestions = mQuestionRelation.getQuery();
getQuestions.addAscendingOrder("createdAt");
getQuestions.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> questions, ParseException e) {
if (e == null) {
mQuestions = questions;
String[] answerText = new String[mQuestions.size()];
int i = 0;
for (ParseObject question : mQuestions) {
answerText[i] = question.getString("question");
i++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout._item_question, R.id.questionText, answerText);
mQuestionsList.setAdapter(adapter);
}
}
});
}
最佳答案
您在不同的线程中获取关系(因为它是在后台执行的)。这意味着该设置实际上并不是在 onCreate() 中完成的,而是有时稍后完成,因此“done”方法可能会在 onResume() 之后调用,具体取决于查询的速度有多慢。如果发生这种情况,那么您确实会得到一个空指针异常。
关于java - onCreate 中设置的属性,导致 onResume 中出现 NullPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27012101/