gpt4 book ai didi

java - 如果在 Java 中的局部变量范围之外使用,列表将显示为 null

转载 作者:行者123 更新时间:2023-11-30 01:50:57 25 4
gpt4 key购买 nike

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

问题:当我运行应用程序时出现索引越界异常(异常指向在 query.getFirstInBackground< 之外使用 mCopy 的行 代码块。当我调试应用程序并在 mCopy(list of words available to user) 上设置断点时,它显示一个空列表。需要注意的是,wordsList 出现在后端,如果我执行 query.getFirstInBackground block 中的所有代码,我没有问题。但是,我想要的是一旦 mCopy 从中检索列表解析,我可以在类里面的任何地方使用 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 中没有异常,我错了。我得到索引超出范围的异常。抱歉。

最佳答案

如前所述here , 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());


});

关于java - 如果在 Java 中的局部变量范围之外使用,列表将显示为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33057178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com