2013-06-19 2 views
5

У меня есть активность, которая отображает карту google с некоторой дополнительной информацией. Также у меня есть служба, которая загружает информацию с сервера и периодически информирует о том, что другая часть информации загружается с помощью PendingIntent.
На Android 4.0.3 все работает нормально. Но на Android 2.3.4 карта в действии мигает (становится серым и перезагружается) каждый раз, когда служба сообщает об этом мероприятии.
Пробовал отслеживать, если карта обновляется в любом месте onActivityResult, но это не так.
Любая помощь оценивается. Вот код:Странное поведение активности в разных версиях Android: map blinks

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) {}   
    } 

UPDATE
Doing еще несколько тестов, я обнаружил, что это просто карта перегрузочные себя при каждом вызове 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();  
+0

Вы переопределяете onConfigurationChange? можете ли вы предоставить коды для updDispState(), updDateSpinners() и любого другого места, где вы обновляете свою карту, или на дисплее –

ответ

1

Вы не должны использовать onActivityResult таким образом от службы. Посмотрите на использование BroadcastReceiver. Ваш класс Activity должен зарегистрировать прослушиватель вещания, а ваш Service должен отправить широковещательную рассылку Intent, когда появится новая информация.

+0

не знаете, о чем говорите, потому что я отправляю ожидающее намерение вернуться к действию со службы когда информация доступна. – Natalia

+0

Когда вы отправляете 'PendingIntent', будут вызываться методы жизненного цикла вашей активности, это вызывает странное поведение с вашим« MapFragment ». Использование «BroadcastReceiver» позволит вашей «Деятельности» оставаться бесперебойной и по-прежнему получать результаты из вашего фона «Сервис». Используйте метод 'sendBroadcast' из вашего' Service' и реализуйте приемник в вашем классе 'Activity'. – twaddington

+0

Хорошо, спасибо за ваш ответ, я попробую этот подход и приму ваш ответ, если он будет работать. Но моя щедрота куда-то уехала (( – Natalia

0

У меня есть аналогичная проблема, когда я перемещаю карту (показывая меню) в android 4.0, она отлично работает, но в 2.3 происходит то, что вы сказали. Я не мог ничего исправить, поэтому мое решение использовало относительный макет и отображало информацию перед картой. Я думаю, что в «старых версиях» android карта не оптимизирована для обновления в фоновом режиме, и поэтому он становится черным и обновляется.

+0

Как вы обновляете относительный макет при перемещении карты или изменении масштаба? Мне нужно нарисовать круг на карте, которые должны оставаться на одинаковых координатах и ​​радиусе в метрах, что бы ни случилось с картой. – Natalia

+0

вы говорите об изменении внутри карты, нарисовав оверлей? –

+0

да, о наложении, когда карта iz увеличена или перемещена – Natalia

Смежные вопросы