在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
这是我需要变量的值,所以我可以使用它。如何在我的情况下同步我的线程以消除竞争条件?根据我的理解GetCallback<ParseObject>()
在另一个线程上运行,因此可能导致我的问题。
答案 0 :(得分:0)
这听起来像是一个经典的多线程问题。一种方法是在同步下获得startTime,也许还有endTime。最简单的事情是......
public class MainActivity extends AppCompatActivity {
String startTime = "";
String endTime = "";
...
public synchronized void setStartTime(String startTime) {
this.startTime = startTime;
}
public synchronized String getStartTime() {
return startTime;
}
...
public void dailyHours() {
...
setStartTime(clockIn.getString("Time"));
Log.d(TAG, "StartTime: " + getStartTime());
...
}
}
“最简单”是一个可操作的术语,还有其他方法可以实现这一点,其中最重要的是弄清楚如何完全避免异步这样做。多线程这个只是处理一些命令参数对我来说似乎有些过分。只是说'