【问题标题】:Can't return location from one activity to another无法将位置从一项活动返回到另一项活动
【发布时间】:2017-10-08 08:43:32
【问题描述】:

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

【问题讨论】:

    标签: android mysql google-maps


    【解决方案1】:

    Cuz,它启动 AsyncTask 并返回位置对象(无论该对象的状态是什么)。它不会等待 AsyncTask 完成执行。

    解决方案:- 您可以在该类中创建一个接口并在onPostExecute() 中执行在活动中实现该接口或将其与类对象匿名使用。现在,只要它回调,您就可以完成剩下的工作。

    【讨论】:

      【解决方案2】:

      我没有看到 location 是在哪里定义的,但是看起来您正在混合异步和同步代码。

      AddEmployee ae = new AddEmployee();
      ae.execute();
      return(location);
      

      在这一部分中,您调用一个异步任务,如果任务成功,它将为location 分配一个新值,但是这里的关键字是异步的,这里location 将在异步任务完成之前返回。您可以创建一个 Listener 并在 onPostExecute 中调用它。

      MainActivity activity=new MainActivity(busid);
      location=activity.addEmployee();
      

      在这里,我强烈建议创建一个新类并将 addEmployee 放在那里(以及其他不特定于 Activity 的逻辑)。使用新关键字创建新活动不是一个好方法。

      【讨论】:

      • 我如何创建一个监听器并在 onPostExecute 中调用它?
      • SRB禁令描述了一个粗略的实现,您也可以搜索Java回调以获得更多示例。一个例子是:stackoverflow.com/a/18279545/1364138
      猜你喜欢
      • 2021-01-16
      • 2016-03-07
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多