如何访问外部方法的字符串
How to access String outside method
我正在尝试访问解析查询外的字符串,它在查询外不起作用,但在查询内起作用。
我声明了全局变量并尝试访问它,但它仍然无法正常工作,而不是将其字符串 returns 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,它将是 non-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 仍然为空,因为您的查询需要时间来执行。执行 done() 后,您将获得字符串。
如果你必须在那个块中有你的值,你可以睡一两秒钟并检查 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);
我正在尝试访问解析查询外的字符串,它在查询外不起作用,但在查询内起作用。 我声明了全局变量并尝试访问它,但它仍然无法正常工作,而不是将其字符串 returns 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,它将是 non-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 仍然为空,因为您的查询需要时间来执行。执行 done() 后,您将获得字符串。
如果你必须在那个块中有你的值,你可以睡一两秒钟并检查 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);