如何访问方法外的字符串

时间:2018-03-05 09:47:06

标签: java android parse-platform

我正在尝试访问解析查询之外的字符串,它不在查询外工作,但它在查询内部工作。 我声明了全局变量,并试图访问它,但它仍然不起作用,而不是字符串,它返回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");
    }
    }

4 个答案:

答案 0 :(得分:1)

有一个非常简单的问题。首先,您在点击API(后台)后从数据中获取checkAns的值。因此,如果数据来自API,它将是非空的。

在后面的部分中,由于API响应需要时间,try-catch块将在checkAns中设置值之前执行,因此checkAns等于初始化值{{1} }。

理想情况下,您应该仅在null方法中使用checkAns的值。

答案 1 :(得分:1)

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();
                }
            }

        });

答案 2 :(得分:1)

这是异步函数的正常行为。

当你的try / catch块被执行时,checkanswer仍然为null,因为你的查询需要时间来执行。一旦完成(),你就会得到你的字符串。

如果您必须在该区块中拥有您的值,您可以睡一两秒,并检查checkanswer是否不再为空。小心睡眠,因为如果你在主线程中使用它们,它们会挂起你的程序

答案 3 :(得分:1)

问题是你的try catch块将在你的查询完成后执行,这意味着在执行try catch块后,覆盖的done方法将调用并设置checkAns。 如果您将使用findInBackground方法,而不是在您已完成的方法中使用方法,您将执行以下所有操作:

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);