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

Posted

技术标签:

【中文标题】无法将位置从一项活动返回到另一项活动【英文标题】: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。

【问题讨论】:

【参考方案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回调以获得更多示例。一个例子是:***.com/a/18279545/1364138

以上是关于无法将位置从一项活动返回到另一项活动的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像从一项活动发送到另一项活动?

如何将字符串从一项活动发送到另一项活动?

将值从一项活动更新到另一项活动

java 将一项活动的数据发送到另一项活动

无法在一项活动中获取加速度计传感器和 GPS 位置数据,问题出在哪里?

如何将数据从一项活动传递到多项活动?