如果在Java的局部变量范围之外使用List,则显示为空



Background:我正在创建一个回合制多人游戏。该用户与其他用户随机匹配。匹配后,用户将获得一个单词列表,他将需要使用这些单词来提醒游戏。这个单词列表是从一个更大的列表中随机选择的。

问题:当我运行应用程序时,我得到索引越界异常(异常指向mCopyquery.getFirstInBackground代码块之外使用的行。当我调试应用程序并在mCopy(用户可用的单词列表)上设置断点时,它显示了一个空列表。应该注意的是,wordsList出现在后端,如果我执行query.getFirstInBackground块中的所有代码,我没有问题。然而,我想要的是,一旦mCopy从Parse检索列表,我可以在类的任何地方使用mCopy。

相关代码如下:

public class PlayGameActivity extends Activity {
    protected LinkedList<String> mCopy; //This is a global variable where words are stored

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_game);
        mCopy = new LinkedList<String>();
        Intent cameFromGIPActivity = getIntent();
        mCameFromGIPActivity = cameFromGIPActivity.getStringExtra(ExTRA_GamesInProgress);
        // if this is null, that means opp came from FindingOpp Activity
        if (mCameFromGIPActivity == null) {
            //use the opponent name as a key to get selected words(value)
            ParseQuery<ParseObject> query = ParseQuery.getQuery(ParseConstants.CLASS_GAMES_IN_PROGRESS);
            query.whereMatches(ParseConstants.KEY_OPPONENT_NAME, mOpponentName);
            query.getFirstInBackground(new GetCallback<ParseObject>() {
                @Override
                public void done(ParseObject gameInfo, ParseException e) {
                    if (e == null) {
                        Log.d(TAG, "success!");
                        mSavedWordList = gameInfo.getString(ParseConstants.KEY_SELECTED_WORDS);
                        Gson gson = new Gson();
                        Type type = new TypeToken<ArrayList<String>>() {
                        }.getType();
                        ArrayList<String> finalWordList = gson.fromJson(mSavedWordList, type);
                        mCopy.addAll(finalWordList);
    });


         word1 = (TextView) findViewById(R.id.word1); //I get the index out of bound exception here,
         word1.setText(mCopy.get(1));
         word1.setOnClickListener(new View.OnClickListener());

Edit1:我之前说过我在logCat中没有异常,我错了。我得到了下标出界异常。道歉。

如前所述,getFirstInBackground在一个单独的线程中根据您的查询检索ParseObject,而不会阻塞/冻结当前线程中的执行。一旦获取完成,将调用回调对象中的done()

尽管看起来你的语句在你的代码中是一个接一个排序的,但getFirstInBackground是一个异步操作。因此,fetch将在不同的线程中运行,而代码中的其余语句将执行。

当你的mCopydone方法中更新时,任何依赖于更新的代码都应该在相同的方法中执行,如下所示。

    query.getFirstInBackground(new GetCallback<ParseObject>() {
               @Override
               public void done(ParseObject gameInfo, ParseException e) {
                    if (e == null) {
                         Log.d(TAG, "success!");
                         mSavedWordList = gameInfo.getString(ParseConstants.KEY_SELECTED_WORDS);
                         Gson gson = new Gson();
                         Type type = new TypeToken<ArrayList<String>>() {
                            }.getType();
                         ArrayList<String> finalWordList = gson.fromJson(mSavedWordList, type);
                         mCopy.addAll(finalWordList);
                         /* mCopy is updated here - so use it now*/
                         word1 = (TextView) findViewById(R.id.word1); 
                         word1.setText(mCopy.get(1));
                         word1.setOnClickListener(new View.OnClickListener());

    });

相关内容