Background:我正在创建一个回合制多人游戏。该用户与其他用户随机匹配。匹配后,用户将获得一个单词列表,他将需要使用这些单词来提醒游戏。这个单词列表是从一个更大的列表中随机选择的。
问题:当我运行应用程序时,我得到索引越界异常(异常指向mCopy
在query.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将在不同的线程中运行,而代码中的其余语句将执行。
当你的mCopy
在done
方法中更新时,任何依赖于更新的代码都应该在相同的方法中执行,如下所示。
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());
});