如何基于AsyncTask结果更新地图标记

时间:2019-06-01 16:08:00

标签: android google-maps android-asynctask

我有一个asyncTask CommunicationThread,它创建了一些纬度和经度。我也有一个地图活动,我想在其中获取CommunicationThread的结果,并根据这些结果更新标记。这是我的地图活动代码。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private Thread2ThreadInfo connectionInfo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    connectionInfo = SubscriberActivity.getConnInfo();
}

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

    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        Value currentPosition;
        @Override
        public void run() {
            while(true) {
                Log.e("start", "new thread");
                CommunicationThread communicationThread = new CommunicationThread();
                try {
                    currentPosition = communicationThread.execute(connectionInfo).get();
                    Log.e("start", currentPosition.toString());

                    LatLng templt = null;
                    double lat = currentPosition.getLatitude();
                    double lon = currentPosition.getLongtitude();
                    LatLng lt = new LatLng(lat, lon);

                    templt = lt;

                    MarkerOptions a = new MarkerOptions().position(lt).title(currentPosition.getBus().getBusLineId());
                    Marker m = mMap.addMarker(a);
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(lt));
                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(templt, 13.0f));
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
}
}

CommunicationThread正常工作,并且数据(位置)被发送到地图活动。我使用无限循环执行CommunicationThread任务,并在有新职位时,将其提取。我还使用处理程序以避免主线程内的无限循环问题。当我运行它时,数据发送成功(根据循环内生成的日志),但是映射如下所示:

enter image description here

当我没有无限循环地运行它(仅针对一个位置)时,它会正常运行。 还有其他想法吗?

2 个答案:

答案 0 :(得分:0)

您是否获得了Google Maps API的密钥? 如果不是,则必须获取密钥才能在应用程序中使用google地图

请点击此链接 Get an API Key

答案 1 :(得分:0)

1。缺少或不正确或已禁用的API密钥

似乎是最常见的。我建议遵循official documentation。如果完成所有步骤,问题仍然存在,并且您仍然不确定是否可能是原因,请克隆官方的android示例,找到MapWithMarker示例(android-samples / tutorials / MapWithMarker)并对其进行测试。如果您运行示例并正确显示了地图,请尝试将默认API KEY交换为您拥有的API KEY。

在这种情况下,请确保已在Google API控制台中启用了它。

2。缺少Android GMS版本元数据标记

您的AndroidManifest.xml需要定义以下元数据属性:

<meta-data android:name="com.google.android.gms.version"
      android:value="@integer/google_play_services_version" />

有关更多详细信息和官方文档,请参见此处的答案。

3。缺少用户权限

在旧版Android SDK中,您必须明确设置某些用户权限才能正确使用Google Maps API,例如:

<uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

情况不再如此,但我建议您访问官方文档,以确保您符合这些版本要求。

4。 OpenGL ES版本2的要求

过去,似乎需要在AndroidManifest.xml

中指定以下元数据属性
<uses-feature   
   android:glEsVersion="0x00020000"  
   android:required="true"/>