【问题标题】:Strange behaviour of an activity on different android versions: map blinks不同Android版本上的活动的奇怪行为:地图闪烁
【发布时间】:2013-06-16 00:44:00
【问题描述】:

我有一个显示谷歌地图和一些附加信息的活动。此外,我还有一项服务,可以从服务器下载信息并定期通知活动使用 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();    

【问题讨论】:

  • 您是否覆盖 onConfigurationChange?能否请您提供 updDispState()、updDateSpinner() 以及您要更新地图或显示的任何其他地方的代码

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


【解决方案1】:

您不应该在服务中以这种方式使用onActivityResult。考虑改用BroadcastReceiver。你的Activity 类应该注册一个广播监听器,当有新信息可用时你的Service 应该发送一个广播Intent

【讨论】:

  • 不确定您在说什么,因为当信息可用时,我正在将待处理的意图从服务发送回活动。
  • 当您发送PendingIntent 时,您的Activity 的生命周期方法将被调用,这会导致您的MapFragment 出现奇怪的行为。使用BroadcastReceiver 将使您的Activity 保持不间断运行,并且仍然从您的背景Service 接收结果。使用 Service 中的 sendBroadcast 方法并在 Activity 类中实现接收器。
  • 好的,谢谢您的回复,我会尝试这种方法,如果可行,我会接受您的回答。但是我的赏金在某个地方消失了((
  • 真的,你是救生员!我以为我无法度过这个难关。有没有办法给你一个赏金?
  • 您已经接受了我的回答,这很好。你也可以支持我的回答。真的,我很高兴它对你有帮助。祝你好运!
【解决方案2】:

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

【讨论】:

  • 当地图移动或缩放改变时如何更新相对布局?我需要在地图上画一个圆圈,无论地图发生什么,它都需要保持相同的坐标和半径(以米为单位)。
  • 你说的是在地图内部修改绘制覆盖?
  • 当您添加叠加层时,它会在 UI 线程上运行,因此我认为您无法对其执行任何操作,但您可以尝试使用 AsyncTask 来处理信息,然后在地图中显示。这里或多或少有一个例子stackoverflow.com/questions/8744573/…
  • 不,我不是这个意思。每次 onResume() 调用时,我的叠加项目都会与地图一起闪烁。您建议使用相对布局而不是覆盖(如果我理解正确的话)。所以地图仍然会闪烁,但布局不会。但是如果用户将地图放大或缩小,布局中显示的所有圆圈都会变得不正确
猜你喜欢
  • 2021-02-07
  • 2014-09-07
  • 2011-01-26
  • 2019-03-17
  • 2013-06-19
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2019-01-05
相关资源
最近更新 更多