обновить список в моей деятельности из службы Android

у меня 2 класса,

1. Класс активности

2. Класс обслуживания

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

ссылочные страницы


person GK_    schedule 09.12.2013    source источник


Ответы (3)


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

Ознакомьтесь с моим сервисом здесь: 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;
    }
}

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

person Madhur Ahuja    schedule 09.12.2013

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

  public static Handler UIHandler;

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

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

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

MainActivity.runOnUI(new Runnable()
{
    public void run()
    {
        try
        {
            MainActivity.listviewAdapter.notifyDataSetChanged();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
});
person Ayaz Alifov    schedule 01.09.2014
comment
Это хорошо, пока работает, но я боюсь некоторых исключений, связанных с потоком, после:/ - person Reda; 21.10.2015

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

person takendarkk    schedule 09.12.2013
comment
Спасибо за ваш ответ.. На самом деле вы правы. Но мой вопрос в том, как я узнаю, что набор данных изменился в результате моей деятельности.. Как я должен получить информацию от моего сервиса? - person GK_; 09.12.2013
comment
Мне не приходилось делать это лично, поэтому я не могу точно сказать, какой метод лучше, но я думаю, что BroadcastReceiver подойдет вам. Это абстрактный класс, который может обрабатывать сообщения, передаваемые службой. Служба будет использовать свой метод sendBroadcast(), когда найдет новую строку, и ваша активность будет зарегистрирована как BroadcastReciever, которая будет выполнять некоторые действия при получении широковещательной передачи. - person takendarkk; 09.12.2013