活动在不同Android版本上的奇怪行为:地图闪烁

时间:2013-06-19 13:04:51

标签: android google-maps android-activity android-version

我有一项活动显示谷歌地图和一些其他信息。此外,我还有一项服务从服务器下载信息,并定期通过PendingIntent通知活动另一部分信息。
在Android 4.0.3上一切正常。但是在Android 2.3.4上,每次服务通知此活动时,活动中的地图会闪烁(变为灰色而不是重新加载)。
试图追踪是否在onActivityResult中的任何地方更新了地图,但事实并非如此。
任何帮助表示感谢。这是一些代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == SERVICE_CACHED) {
        String fmId = data.getStringExtra("cachedId");
        if (dev.get(position).getId().equals(fmId)) {   //we still viewing the same device
            long[] dat = data.getLongArrayExtra("dates");
            ArrayList<Date> dates = new ArrayList<Date>();
            for (int i=0; i<dat.length; i++) {
                dates.add(new Date(dat[i]));
            }

            addDates(fmId, dates, false, true);

//this is executed only once, as it meant to be
            if ((dispDate.getText() == null) || (dispDate.getText().toString().isEmpty())) {
                State state;
                synchronized(DBHelper.class) {
                    state = DBHelper.getState(fmId, dates.get(0).getTime());
                }


                updDispState(state);
            }
        }
    }
}


public void addDates(String fmId, ArrayList<Date> dates, boolean clear, boolean addTimesTo0) {
    if (dev.get(position).getId().equals(fmId)) {   //maybe user already changed selected device
        if (clear) {
            this.dates = dates;
        } else {
            this.dates.addAll(0, dates);
        }
        updDateSpinners(clear, dates, addTimesTo0);
    }
}

服务使用此信息通知活动:

private void cache(LinkedList<State> statsAll, LinkedList<Long> datesAll) {
        if ((statsAll == null) || (statsAll.isEmpty()) || (datesAll == null) || (datesAll.isEmpty())) {
            return;
        }

        synchronized(DBHelper.class) {
            DBHelper.addStates(statsAll, fmId);
        }
        //inform MapActivity that new data is available
        long[] l = new long[datesAll.size()];
        for (int i=0; i<l.length; i++) {
            l[i] = datesAll.get(i);
        }
        Intent intent = new Intent().putExtra("cachedId", fmId).putExtra("dates", l);
        try {
            pi.send(CacheService.this, MapActivity.SERVICE_CACHED, intent);
        } catch (PendingIntent.CanceledException e) {}          
    }

更新
做了一些测试我发现它只是在每次onResume()调用时重新映射自己。怎么阻止它?
我把地图放在xml中就像这样:

<fragment             
    android:id="@+id/mapF"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment" /> 

稍后在代码中检索它

GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapF)).getMap();    

2 个答案:

答案 0 :(得分:1)

您不应该以这种方式从服务中使用onActivityResult。请考虑使用BroadcastReceiver代替。您的Activity课程应该注册广播听众,而Service应该在有新信息时发送广播Intent

答案 1 :(得分:0)

当我在Android 4.0中移动地图(显示菜单)时我有类似的问题它工作正常但在2.3中发生了你所说的。我无法做任何事情来解决它所以我的解决方案是使用相对布局并在地图前显示信息。我认为在android的“旧版本”中,地图没有针对后台更新进行优化,这就是为什么他会变黑并更新。