在if语句中记录时,我可以成功获取“startTime”变量的值。一旦我尝试从if语句外部访问此变量,我的问题就出现了。
public class MainActivity extends AppCompatActivity {
String startTime = "";
String endTime = "";
....
....
....
public void dailyHours(){
//Retrieve clockInId (ObjectID for clockInTime)
ParseQuery<ParseObject> startQuery = ParseQuery.getQuery("clockIn");
startQuery.getInBackground(clockInId, new GetCallback<ParseObject>() {
public void done(ParseObject clockIn, ParseException e) {
if (e == null) {
startTime = clockIn.getString("Time");
Log.d(TAG, "StartTime: " + startTime);
} else {
// something went wrong
}
}
});
//Retrieve clockOutId (ObjectID for clockOutTime)
ParseQuery<ParseObject> endQuery = ParseQuery.getQuery("clockOut");
endQuery.getInBackground(clockOutId, new GetCallback<ParseObject>() {
public void done(ParseObject clockOut, ParseException e) {
if (e == null) {
endTime = clockOut.getString("Time");
Log.d(TAG, "EndTime: " + endTime);
} else {
// something went wrong
}
}
});
}
例如,当Log.d()被移动到ParseQuery之外时,startTime返回空。
public void dailyHours(){
//Retrieve clockInId (ObjectID for clockInTime)
ParseQuery<ParseObject> startQuery = ParseQuery.getQuery("clockIn");
startQuery.getInBackground(clockInId, new GetCallback<ParseObject>() {
public void done(ParseObject clockIn, ParseException e) {
if (e == null) {
startTime = clockIn.getString("Time");
} else {
// something went wrong
}
}
});
Log.d(TAG, "StartTime: " + startTime); //startTime returns an empty string when moved here.
答案 0 :(得分:2)
GetCallback<ParseObject>()
方法是异步调用的(在另一个线程中),因此实际分配startTime = clockIn.getString("Time")
可以在Log.d(TAG, "StartTime: " + startTime)
之后执行。
你有&#34;竞争条件&#34;这里。
答案 1 :(得分:2)
无论如何,if
或else
都会被执行。而且您每次都在if
部分设置价值。如果您的代码进入else
块,则表示if
没有执行,这意味着值未设置。
如果您想在if
和else
中访问该值,请在if
阻止之前设置它。
答案 2 :(得分:2)
变量的范围没有问题,这是同步问题。在这里你有一个竞争条件。这是因为getInBackground
。它们不在同一个线程中执行。
在startQuery.getInBackground
之后,它开始了一个新的exectuion线程。直接走到下一行。
Log.d(TAG, "StartTime: " + startTime); //startTime returns an empty s
在进入上述行之前,无法保证后台已完成并执行回调方法。