首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何基于AsyncTask结果更新地图标记

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

Stack Overflow用户
提问于 2019-06-02 00:08:00
回答 2查看 65关注 0票数 1

我有一个asyncTask CommunicationThread,它可以创建一些纬度和经度。我还有一个地图活动,我想在其中获取CommunicationThread的结果,并基于这些结果更新标记。这是我的map活动的代码。

代码语言:javascript
运行
复制
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任务,当新的位置可用时,获取它们。我还使用了一个处理程序,以避免在主线程中出现无限循环的问题。当我运行它时,数据被成功发送(根据循环中产生的日志),但映射如下所示:

当我在没有无限循环(只针对一个位置)的情况下运行它时,它可以正常运行。还有其他想法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-06-02 00:17:07

你拿到谷歌地图api的密钥了吗?如果没有,则必须获取密钥才能在应用程序中使用google地图

请点击此链接Get an API Key

票数 0
EN

Stack Overflow用户

发布于 2019-06-02 00:21:18

1.接口密钥缺失、不正确或被禁用

似乎是最常见的。我推荐使用official documentation。如果你完成了所有步骤,问题仍然存在,但你仍然不确定这是否是原因,请克隆官方的android示例,找到MapWithMarker示例(android- samples /tutorials/MapWithMarker)并对其进行测试。如果您运行该示例并且它正确地显示了映射,请尝试将默认的API密钥交换为您拥有的API密钥。

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

2.缺少Android GMS版本元数据标签

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

代码语言:javascript
运行
复制
<meta-data android:name="com.google.android.gms.version"
      android:value="@integer/google_play_services_version" />

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

3.缺少用户权限

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

代码语言:javascript
运行
复制
<uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

现在不再是这样了,但我建议您访问官方文档,以确保您满足这些版本要求。

4. OpenGL ES版本2的要求

过去,似乎需要在AndroidManifest.xml中指定以下元数据属性

代码语言:javascript
运行
复制
<uses-feature   
   android:glEsVersion="0x00020000"  
   android:required="true"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56408322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档