![](/img/trans.png)
[英]How to wait until method from another class in asynctask finishes in android
[英]How to delay processes until and AsyncTask finishes?
我遇到了一個問題,其中正在創建對象並將其發送到后端(PARSE),且變量為“ null”,因為另一個AsyncTask尚未完成。
在當前情況下,我檢索位置的坐標,然后通過and接口將它們從AsyncTask傳遞回Fragment。 在此接口方法中,我正在將經度和緯度值分配給全局變量。
這些newSportEvent.saveInBackground(); 似乎是在從AsyncTask給_longitude / _latitude變量賦值之前調用的。 我可以將.saveInBackground()封裝在if語句中,但這仍然給我帶來一個問題,該問題涉及兩次按下“接受”按鈕以完成所有操作。
如何延遲不創建對象並將其發送到數據庫的過程,直到設置了值?
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);
}
將newSportEvent.saveInBackground()
和相關代碼移至AsyncTask
的onPostExecute()
方法。 這將確保僅在AsyncTask
完成后才能執行此代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.