Асинхронное обновление Android контекстного меню - PullRequest
1 голос
/ 13 января 2012

Словом, мне нужно обновить контекстное меню для виджета (в данном случае это просмотр списка).

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

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

Ответы [ 3 ]

2 голосов
/ 13 января 2012

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

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

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

1 голос
/ 15 января 2012

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

0 голосов
/ 13 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...