如何访问String outside方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何访问String outside方法相关的知识,希望对你有一定的参考价值。
我正在尝试访问解析查询之外的字符串,它不在查询外工作,但它在查询内部工作。我声明了全局变量,并尝试访问它,但它仍然无法正常工作,而不是字符串,它返回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,它将是非空的。
在后面的部分中,由于API响应需要时间,因此try-catch
块将在checkAns
中设置值之前执行。因此checkAns
等于初始化值null
。
理想情况下,您应该仅在checkAns
方法中使用done()
的值。
在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,因为您的查询需要一些时间来执行。一旦完成(),你就会得到你的字符串。
如果您必须在该区块中拥有您的值,您可以睡一两秒,并检查checkanswer是否不再为空。请注意睡眠,因为如果您在主线程中使用它们,它们将挂起您的程序
问题是你的try catch块将在你的查询完成后执行意味着重写的done
方法将在你执行try catch块之后调用并设置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);
以上是关于如何访问String outside方法的主要内容,如果未能解决你的问题,请参考以下文章