2012-01-13 18 views
1

Word up、ウィジェット(この場合はlistview)のコンテキストメニューを更新する必要があります。非同期の更新Androidのコンテキストメニュー

メニューの項目は、Webサービスの呼び出しから取得する必要があります。 WebサービスコールがメインのUIスレッドで同期的に行われた場合、これは機能します。

しかし、私はWebサービスを呼び出しているため、AsyncTaskなどを使って非同期的にANRなどを回避する必要があります。このonCreateContextMenu内のmenu.add()によるメニューの非同期更新は、つまり、menu.add()への非同期呼び出しはコンテキストメニューを表示しません。また、非同期メニューの更新は、AsyncTaskのonPostExecuteを介してUIスレッドで行われます。

答えて

2

すべてのUiアップデートはUIスレッドで行う必要があります。だからあなたはUiスレッドにrunnableをポストする必要があります。

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

それとも、)(AsynctaskのdoinBackground機能でpublishprogress()を呼び出し、その後onProgressUpdate上のUIの作業を行う必要がありますよう 何か。 Uiアップデートが待つことができる場合は、OnPostExecute

+0

ありがとうございました。しかし、私はすでに本質的にこれを、AsyncTaskのonPostExecuteメソッドで行っています。このメソッドは、私のためにuiスレッドに更新を戻します。問題が単純だったのであれば良いだろう;) – scrojaxx

0

を保存してください。情報を保存すると、アクティビティのWebサービスから取得できます。次に、onPrepareContextMenu()でこの情報を使用してメニューを更新します。コンテキストメニューが表示される前にonPrepareContextMenu()が呼び出されます。 OnCreateContentMenu()は、すべてのアクティビティインスタンスに対して1回だけ呼び出されます。

+0

ありがとうstefan、私はアクティビティでオーバーライドできるonPrepareContextMenuがないようです。前にonPrepareOptionsMenuでオプションメニューのために説明した戦略を使用しましたが、あなたが言及したonPrepareContextMenuメソッドを見つけることができませんでした。 onPrepareContextMenuはどのクラスまたはインタフェース上で定義されていますか? – scrojaxx

+0

申し訳ありません、あなたはそうです、onPrepareContextMenu()はありません。私はオプションメニューを念頭に置いていました。 onCreateContextMenuはonCreateOptionsMenuとは異なり、メニューが表示される前に呼び出されます。これは一度だけ呼び出されます。 – Stefan

1

回答をいただいた方々のおかげで、私は幾分半分焼いた解決策でこれを残さなければならないかもしれません。この問題を抱えている読者には、現在のソリューションでは、アクティビティのopenContextMenu(Viewビュー)メソッドを使用してonCreateContextMenuをコールバックします。シンプルブール状態フラグは、非同期呼び出しを行うか、以前の非同期呼び出しのデータをメニューに取り込むかを決定します。このデザインは少し厄介で壊れやすいと感じますが、うまく動作します。

関連する問題