可变范围[JAVA]

时间:2015-08-27 23:23:00

标签: java android

在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.

3 个答案:

答案 0 :(得分:2)

GetCallback<ParseObject>()方法是异步调用的(在另一个线程中),因此实际分配startTime = clockIn.getString("Time")可以在Log.d(TAG, "StartTime: " + startTime)之后执行。

你有&#34;竞争条件&#34;这里。

答案 1 :(得分:2)

无论如何,ifelse都会被执行。而且您每次都在if部分设置价值。如果您的代码进入else块,则表示if没有执行,这意味着值未设置。 如果您想在ifelse中访问该值,请在if阻止之前设置它。

答案 2 :(得分:2)

变量的范围没有问题,这是同步问题。在这里你有一个竞争条件。这是因为getInBackground。它们不在同一个线程中执行。

startQuery.getInBackground之后,它开始了一个新的exectuion线程。直接走到下一行。

Log.d(TAG, "StartTime: " + startTime); //startTime returns an empty s

在进入上述行之前,无法保证后台已完成并执行回调方法。