无法将位置从一个活动返回到另一个活动

时间:2017-10-08 08:43:33

标签: android mysql google-maps

我正在尝试使用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。

2 个答案:

答案 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关键字创建新活动不是一个好方法。