簡體   English   中英

如何在方法外部訪問String

[英]How to access String outside method

我正在嘗試在解析查詢外部訪問一個字符串,它在查詢外部無效,但在查詢內部有效。 我聲明了全局變量並嘗試訪問它,但是它仍然不起作用,它不是字符串而是返回null。

我是Java和Android的新手,所以如果這是個愚蠢的問題,請原諒我。

任何幫助,將不勝感激。

public class ActivityQuiz extends AppCompatActivity {

ArrayList<String> answerList = new ArrayList<>();

int c=0;

String Answer = "correct";
String selectedOption;
public static String  checkAns;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);


    ParseQuery<ParseObject> query = ParseQuery.getQuery("Question");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> questions, ParseException e) {
            if (e == null) {
                for (ParseObject question : questions) {                        
                    answerList.add(question.getString(Answer));
                     checkAns = getanswerList.get(c);
                     Log.d("String check",""+checkAns); //here it's working
                }

            } else {
                e.printStackTrace();
            }
        }

    });

    try{

    String checkanswer = checkAns ; // here returns null instead of string
    Log.d("String checkans",""+checkanswer);}
    catch (Exception e)
    {
        e.printStackTrace();
        Log.d("Error", "Error, Not Working");
    }
    }

有一個非常簡單的問題。 首先,您在點擊API后(在后台)從數據中獲取checkAns的值。 因此,如果數據來自API,則它將為非null。

在后面的部分中,由於API響應需要時間,因此try-catch塊將在執行checkAns設置值之前執行,因此checkAns等於初始化值null

理想情況下,應僅在done()方法內使用checkAns的值。

像下面這樣在ParseQuery中添加try-catch代碼:

ParseQuery<ParseObject> query = ParseQuery.getQuery("Question");
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> questions, ParseException e) {
                if (e == null) {
                    for (ParseObject question : questions) {                        
                        answerList.add(question.getString(Answer));
                         checkAns = getanswerList.get(c);
                         Log.d("String check",""+checkAns); //here it's working

                         // ....Add your try catch code.....
                         try{
                              String checkanswer = checkAns ; // also working well
                              Log.d("String checkans",""+checkanswer);}
                              catch (Exception e)
                              {
                                  e.printStackTrace();
                                  Log.d("Error", "Error, Not Working");
                              }
                           }

                } else {
                    e.printStackTrace();
                }
            }

        });

這是異步功能的正常行為。

到您的try / catch塊執行時,checkanswer仍然為null,因為查詢需要花費一些時間來執行。 一旦執行done(),您將擁有您的字符串。

如果您必須在那個區塊中擁有自己的價值,則可以睡一兩秒鍾,然后檢查checkanswer是否不再為null。 注意睡眠,因為如果您在主線程中使用它們,它們將掛起您的程序

問題是您的try catch塊將在查詢完成后執行,這意味着重寫的done方法將在您執行try catch塊后調用並設置checkAns。
如果您要使用findInBackground方法,而不是在done方法中創建一個方法,那么您將在其中進行所有操作,例如:

query.findInBackground(new FindCallback<ParseObject>() {
    @Override
    public void done(List<ParseObject> questions, ParseException e) {
      if (e == null) {
        successful(questions);

      } else {
        e.printStackTrace();
      }
    }

  });

  private void successful(List<ParseObject> questions){
    for (ParseObject question : questions) {
      answerList.add(question.getString(Answer));
      Log.d("String checkans",""+checkanswer);
    }
    String checkanswer = getanswerList.get(c);
  }

否則,您可以使用find()方法:

List<ParseObject> questions = query.find();

    for (ParseObject question : questions) {
      answerList.add(question.getString(Answer));
      Log.d("String checkans",""+checkanswer);
    }
    String checkanswer = getanswerList.get(c);

暫無
暫無

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

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