簡體   English   中英

如果在Java的局部變量范圍之外使用,則列表顯示為null

[英]List appears as null if used outside the local variable scope in Java

背景 :我正在創建一個基於回合的多人游戲。 該用戶與另一個用戶隨機匹配。 匹配后,將為用戶提供單詞列表,他將需要使用這些單詞來提醒游戲。 該單詞列表是從更大的列表中隨機選擇的。

問題 :我得到的索引越界例外,當我運行應用程序(例外指向行,其中mCopy使用外query.getFirstInBackground 。代碼塊當我調試的應用程序和設置斷點mCopy (提供給用戶的單詞列表) ,它顯示為空列表。應該注意的是,單詞列表出現在后端,如果我執行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還是一個異步操作。 因此,提取將在其他線程中運行,而代碼中的其余語句將被執行。

由於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());


    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM