2013-12-09 4 views
6

I имея 2 класса,обновления ListView в моей деятельности от службы андроида

1.Activity класса

2.Service класс

мне нужно обновить свой список вид в моей деятельности, когда служба получила любые обновления. На самом деле я пытаюсь как приложение чата, Мои сервисы всегда проверяют мой db, и если он получил новую строку, мне нужно обновить в своей деятельности, не перестраивая снова, только мне нужно обновить представление списка. Я обнаружил, что с ним будет работать iBinder, но я не использую его. Может ли кто-нибудь предложить мне некоторые примеры кода.

referred pages

ответ

4

Вы должны использовать Bound службу. В моем приложении я сделал что-то подобное. Где после нажатия обновления я вызываю службу, которая получает данные в фоновом режиме и обновляет пользовательский интерфейс.

Проверьте мою службу здесь: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/AnalyticsDataService.java

@Override 
protected void onPostExecute(AnalyticsAccountResult result) { 
    super.onPostExecute(result); 
    App.getEventBus().post(result); 
} 

активность: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/MainActivity.java

@Subscribe 
public void UpdateUI(AnalyticsAccountResult result) { 
    ProgressBar progressbar = (ProgressBar) findViewById(R.id.pbHeaderProgress); 
    LinearLayout spinnerLayout = (LinearLayout) findViewById(R.id.spinnerslayout); 
    TextView statusMessage = (TextView) findViewById(R.id.statusMessage); 

    switch (result.getStatus()) { 
     case STARTING: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.VISIBLE); 
     spinnerLayout.setVisibility(View.GONE); 
     break; 

     case FAILURE: 
     statusMessage.setVisibility(View.VISIBLE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.GONE); 
     statusMessage.setText(result.getErrorMessage()); 
     break; 

     case SUCCESS: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.VISIBLE); 

     if (result.getItems() != null) 
     { 
      this.acProfiles = result.getItems(); 
      MyAdapter myAdapter = new MyAdapter(acProfiles, this); 
      listView.setAdapter(myAdapter); 
      UpdateSelectionPreferences(); 
      if (result.isPersist() && acProfiles.size() > 0) 
      { 
       if (App.LOCAL_LOGV) 
       Log.v(App.TAG, "saving configdata");   
       try 
       { 
        appPreferences.saveConfigData(acProfiles, credential.getSelectedAccountName()); 
       } 
       catch (JsonProcessingException e) 
       { 
        Log.e(App.TAG, e.getMessage()); 
       } 
      } 
     } 
     break; 
    } 
} 

Было бы также полезно использовать Отто библиотека:
http://square.github.io/otto/

0

Без дополнительной информации, которую я Можно не дают никаких полезных примеров кода, однако я думаю, что вы можете искать ListAdapter. ListAdapter принимает список и набор данных (в вашем случае может быть массив строк) и объединяет в себе 2. Всякий раз, когда набор данных изменяется (в вашем случае это будет, когда ваша служба обнаруживает новую строку и добавляет ее в массив), вы просто вызовите ListAdapter.notifyDataSetChanged(), и список будет автоматически обновляться с вашей новой информацией. Для получения дополнительной информации о конкретном списке можно использовать http://developer.android.com/reference/android/widget/ArrayAdapter.html.

+1

Thanx для вашего ответа, .. На самом деле вы правы. Но мой вопрос в том, как я знаю, что datas выбрано из моей деятельности. Как я должен быть связан с моим сервисом? – GaneshKumar

+0

Мне не приходилось делать это лично, поэтому я не могу точно сказать, какой метод лучше, но я думаю, что [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) работа для вас. Это абстрактный класс, который может обрабатывать сообщения, передаваемые службой. Служба будет использовать метод sendBroadcast(), когда найдет новую строку, и ваша активность будет зарегистрирована как BroadcastReciever, которая будет выполнять некоторые действия при получении широковещательной передачи. – csmckelvey

3

Предположим, у вас есть класс активности с именем MainActivity, в котором вы инициализировали ListView с помощью адаптера с именем listviewAdapter. Поместите этот код в MainActivity:

public static Handler UIHandler; 

    static { 
     UIHandler = new Handler(Looper.getMainLooper()); 
    } 

    public static void runOnUI(Runnable runnable) { 
     UIHandler.post(runnable); 
    } 

Когда вы внесли изменения в данных ListView внутри класса обслуживания, писать этот код, чтобы применить новые данные в ListView:

MainActivity.runOnUI(new Runnable() 
{ 
    public void run() 
    { 
     try 
     { 
      MainActivity.listviewAdapter.notifyDataSetChanged(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

Это хорошо, сейчас работаю, но боюсь за некоторые связанные с потоком исключения после: / – Reda

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

  • Нет связанных вопросов^_^