如何延迟进程直到和AsyncTask结束?

时间:2014-11-09 22:21:20

标签: java android android-asynctask

我遇到了一个问题,即创建一个对象并将其发送到后端(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);
}

1 个答案:

答案 0 :(得分:2)

newSportEvent.saveInBackground()及相关代码移至onPostExecute()中的AsyncTask方法。这将确保此代码仅在AsyncTask完成后执行。