2012-01-13 3 views
1

Word up, мне нужно обновить контекстное меню для виджета (listview в этом случае).Асинхронное обновление Android контекстное меню

Элементы меню должны поступать от вызова веб-службы. Если вызов веб-службы выполняется синхронно в основном потоке пользовательского интерфейса, это работает.

Однако из-за того, что я звоню в веб-службу, это необходимо сделать асинхронно через AsyncTask или аналогично, чтобы избежать ANR и т. Д. Это асинхронное обновление меню через menu.add() внутри onCreateContextMenu не работа, т.е. асинхронные вызовы menu.add() не приводят к отображению контекстного меню. Также обратите внимание, что обновления асинхронного меню выполняются в потоке пользовательского интерфейса через onPostExecute для AsyncTask.

ответ

2

Все обновления Ui должны выполняться в потоке пользовательского интерфейса. Таким образом, вам придется опубликовать runnable на поток Ui. Что-то вроде

runOnUiThread(new Runnable() { 
    public void run() { 
     //DO UI update here 
    } 
}); 

Или вы должны позвонить publishprogress() в функции doinBackground из AsyncTask, а затем сделать Ui работу на onProgressUpdate(). Если обновление Ui может подождать, вы должны сделать это в OnPostExecute

+0

Спасибо nandeesh, однако я уже делаю это по методу onPostExecute для AsyncTask, который возвращает обновление для потока ui для меня. Было бы неплохо, если бы проблема была такой простой;) – scrojaxx

0

Сохраните информацию, которую вы получаете от веб-службы в своей деятельности. Затем в onPrepareContextMenu() используйте эту информацию для обновления меню. onPrepareContextMenu() вызывается до отображения контекстного меню. OnCreateContentMenu() вызывается только один раз для каждого экземпляра действия.

+0

спасибо stefan, похоже, нет onPrepareContextMenu, который я могу переопределить в Activity. Я использовал описанную выше стратегию для меню опций ранее через onPrepareOptionsMenu, но не могу найти упомянутый метод onPrepareContextMenu. На каком классе или интерфейсе определяется onPrepareContextMenu? – scrojaxx

+0

Извините, вы правы, там нет onPrepareContextMenu(), у меня было меню опций. onCreateContextMenu вызывается перед тем, как меню должно отображаться в отличие от onCreateOptionsMenu, которое вызывается только один раз. – Stefan

1

Благодаря тем, которые предоставили ответы, мне, возможно, придется оставить это на некоторое время с несколько полузасушливым решением. Для тех, кто читает это, которые испытывают ту же проблему, мое текущее решение использует метод openContextMenu (View view) в действии, чтобы перезвонить в onCreateContextMenu. Простой флаг логического состояния определяет, следует ли выполнять асинхронный вызов или заполнять меню данными предыдущего асинхронного вызова. Этот дизайн выглядит немного неудобным и хрупким для меня, но работает.

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