我遇到了一个问题,即创建一个对象并将其发送到后端(PARSE),变量为“null”,因为另一个AsyncTask尚未完成。
在当前情况下,我检索一个位置的坐标,然后将它们从AsyncTask传递回Fragment via和interface。在这个接口方法中,我将经度和纬度值分配给全局变量。
这些newSportEvent.saveInBackground();似乎是在_longitude / _latitude变量从AsyncTask给出一个值之前调用。我可以将.saveInBackground()包装在if语句中,但这仍然会让我遇到一个问题,包括按两次“accept”按钮以完成所有内容。
在设置值之前,如何将进程延迟不创建对象并将其发送到数据库?
case R.id.btnAccept:
String desc = etDesc.getText().toString().trim();
String loc = etLocation.getText().toString().trim();
String time = btnTime.getText().toString().trim();
String date = btnDate.getText().toString().trim();
String sport = tvSportName.getText().toString().trim();
String title = etTitle.getText().toString().trim();
ParseUser currentUser = ParseUser.getCurrentUser();
// check to see if the values are empty
SportEvent newSportEvent = new SportEvent();
newSportEvent.setSport(sport);
newSportEvent.setTime(title);
newSportEvent.setDate(date);
newSportEvent.setTitle(title);
newSportEvent.setDesc(desc);
newSportEvent.setUser(currentUser);
Log.e("LONGITUDE11111", "" + _longitude);
Log.e("LATITUDE111111", "" + _latitude);
//newSportEvent.setLatitude(_latitude);
//newSportEvent.setLongitude(_longitude);
// getLatLongFromAddress(loc);
new LocationAsyncTask(this).execute(loc);
// implement user signin first>>>
// newSportEvent.setUser(ParseUser.getCurrentUser());
ParseACL acl = new ParseACL();
acl.setPublicReadAccess(true);
acl.setPublicWriteAccess(true); // objects created are writable
newSportEvent.setACL(acl);
// create dialog
if (!(_longitude == null) || !(_latitude == null)) {
// publish to ParseDB
Log.e("LONGITUDE11111", "" + _longitude);
Log.e("LATITUDE111111", "" + _latitude);
newSportEvent.setLatitude(_latitude);
newSportEvent.setLongitude(_longitude);
newSportEvent.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
// Update the display
changeFragment();
// progressDialog.dismiss();
}
});
}
break;
case R.id.btnCancel:
changeFragment();
break;
}
}
private void showNavigationActivity() {
Log.e("BUTTON", "SIGN UP PRESSED");
Intent intent = new Intent(getActivity(), NaviActivity.class);
startActivity(intent);
}
@Override
public void getLocation(ArrayList<String> string_array) {
// TO-DO Auto-generated method stub
_longitude = string_array.get(0);
Log.e("LONGITUDE", _longitude);
_latitude = string_array.get(1);
Log.e("LATITUDE", _latitude);
}
答案 0 :(得分:2)
将newSportEvent.saveInBackground()
及相关代码移至onPostExecute()
中的AsyncTask
方法。这将确保此代码仅在AsyncTask
完成后执行。