我正在尝试使用AsyncTask从mysql数据库获取经度和经度并在Map上显示它。我创建了一个从数据库获取位置的类 这是从数据库返回位置的方法
public Location addEmployee() {
class AddEmployee extends AsyncTask<Void, Void, String> {
//ProgressDialog loading;
/* @Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(MainActivity.this, "Retreiving...", "Wait...", false, false);
}*/
@Override
protected void onPostExecute(String success) {
// super.onPostExecute(success);
//loading.dismiss();
try {
parseJSON(success);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(Void... v) {
HashMap<String, String> params = new HashMap<>();
params.put("busid", busid);
RequestHandler rh = new RequestHandler();
String res = rh.sendPostRequest("https://tkajbaje.000webhostapp.com/php/busid.php", params);
return res;
}
public void parseJSON(final String success) throws JSONException {
JSONObject jsonObject;
jsonObject = new JSONObject(success);
if (jsonObject.has("Latitude")) {
location.setLatitude(Double.valueOf(jsonObject.getString("Latitude")));
}
if (jsonObject.has("Longitude")) {
location.setLongitude(Double.valueOf(jsonObject.getString("Longitude")));
}
}
}
AddEmployee ae = new AddEmployee();
ae.execute();
return(location);
}
我有另一个活动从上面的函数获取位置并在地图上显示它。这是代码
public void onMapReady(GoogleMap googleMap) {
// Add a marker in Sydney, Australia,
// and move the map's camera to the same location.
Bundle extras = getIntent().getExtras();
String busid=String.valueOf(1);
Location location;
MainActivity activity=new MainActivity(busid);
location=activity.addEmployee();
double Latitude=location.getLatitude();
Toast.makeText(MapsMarkerActivity.this,String.valueOf(Latitude), Toast.LENGTH_LONG).show();
double Longitude=location.getLongitude();
LatLng sydney = new LatLng(Latitude, Longitude);
googleMap.addMarker(new MarkerOptions().position(sydney)
.title("Bus location"));
googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
但纬度和经度总是恰好是0.0。
答案 0 :(得分:1)
Cuz,它启动AsyncTask并返回位置对象(无论该对象的状态如何)。它不会等待AsyncTask完成执行。
<强>解决方案: - 强>
您可以在该类中创建一个接口,并在onPostExecute()
中执行实现Interface in activity或使用它匿名使用Class对象。现在,无论何时回调,你都可以完成其余的工作。
答案 1 :(得分:1)
我没有看到location
的定义,但看起来你混合了异步和同步代码。
AddEmployee ae = new AddEmployee();
ae.execute();
return(location);
在这一部分中,您将调用异步任务,如果任务成功,将为location
分配一个新值,但此处的关键字是异步的,此处location
将在异步任务完成之前返回。您可以创建一个监听器并在onPostExecute
中调用它。
MainActivity activity=new MainActivity(busid);
location=activity.addEmployee();
在这里,我强烈建议创建一个新类并将addEmployee放在那里(以及其他非特定于Activity的逻辑)。使用new关键字创建新活动不是一个好方法。