Android studio在onMapReady之前执行AsyncClass

时间:2017-07-07 07:00:02

标签: android google-maps android-asynctask

我有这个代码,我必须从数据库yung调用数据asynctask我的googlemap的坐标。但onMapReady正在我的Asynctask之前执行,所以位置始终为null。我在oncreate上调用asynctask,这是我的代码。

onHreate 上的

AsyncTask
        HashMap<String, String> postData = new HashMap<>();
        postData.put("rqstID", rqstID);
        AsyncClass taskDetails = new AsyncClass(AcceptActivity.this, postData, "Getting details", new AsyncResponse() {
            @Override
            public void processFinish(String s) {
                Log.d("AcceptActivity", s);
                JSONObject parentObject = null;
                try {
                    parentObject = new JSONObject(s);
                    JSONArray parentArray = parentObject.getJSONArray("result");
                    JSONObject finalObject = parentArray.getJSONObject(0);
                    lat1 = finalObject.getString("rqstLat");
                    lng1 = finalObject.getString("rqstLng");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        taskDetails.execute("http://10.0.2.2/wingman/requestDetails.php");

onMapReady

 @Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
    LatLng location = new LatLng(Double.valueOf(lat1), Double.valueOf(lng1));
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(location, 15);
    mGoogleMap.moveCamera(update);
    MarkerOptions options = new MarkerOptions()
            .position(location)
            .snippet("I'm around here!!!");
    CircleOptions circle = new CircleOptions()
            .center(location)
            .radius(2000)
            .fillColor(0x55add8e6)
            .strokeColor(Color.BLUE)
            .strokeWidth(2);
    mGoogleMap.addCircle(circle);
    mGoogleMap.addMarker(options);
}

3 个答案:

答案 0 :(得分:0)

在调用Google地图view.getLeft()之前,无法保证您的异步任务可以完成。相反,我建议你从onMapReady()方法本身对地图信息进行REST调用。通过这种方式,您可以确保在触发回调时,会有一个实际的实时Google地图句柄,您可以为其分配标记等。

以下是代码可能如下所示的框架:

onMapReady()

然后在您的异步任务中,您可以解析数据并将标记分配给您的Google地图。

答案 1 :(得分:0)

我认为你必须根据用户体验为你想要在地图上执行的任务创建一个函数,并传递与你在地图上执行任务所需的值相关的参数,如纬度经度。

ListBox

你不需要在onMapReady()函数中执行任何任务

private void yourFunctionName(double lat1, double lng1){
   LatLng location = new LatLng(Double.valueOf(lat1), Double.valueOf(lng1));
   CameraUpdate update = CameraUpdateFactory.newLatLngZoom(location, 15);
   mGoogleMap.moveCamera(update);
   MarkerOptions options = new MarkerOptions()
        .position(location)
        .snippet("I'm around here!!!");
   CircleOptions circle = new CircleOptions()
        .center(location)
        .radius(2000)
        .fillColor(0x55add8e6)
        .strokeColor(Color.BLUE)
        .strokeWidth(2);
   mGoogleMap.addCircle(circle);
   mGoogleMap.addMarker(options);
}

仅存储谷歌地图对象

@Override
public void onMapReady(GoogleMap googleMap) {
   mGoogleMap = googleMap;

}

现在执行网络操作并调用您要执行的功能

mGoogleMap = googleMap;

答案 2 :(得分:0)

在onMapReady()中添加Async并没有帮助,而是用您的Async任务调用替换somefragment.getMapAsync(this)并在onPostExecute的末尾添加somefragment.getMapAsync(this)。