java - onCreate 中设置的属性,导致 onResume 中出现 NullPointer

标签 java android nullpointerexception parse-platform

因此,在我的 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/

相关文章:

java - Elasticsearch 不适用于 Shopizer

java - 使用 mysql PrepareStatement 取消引用可能的空指针警告

android - 使用 FlexboxLayoutManager 将 RecyclerView 项目居中

android - 带有对象 ArrayAdapter 的自定义微调器无法获取资源

java - InetAddress 无法检索 FQDN,而 nslookup 可以

java - 从 extjs 打印 pdf - 最佳解决方案

java - 获取当月日历中的所有日期

java - 什么是NullPointerException,我该如何解决?

java - 找到加载特定类的ClassLoader

java - Android API 25 之后,SQLite db 文件在设备/模拟器上的位置是什么?