单词,我需要更新窗口小部件的上下文菜单(在本例中为listview)。
菜单的项目需要来自对Web服务的调用。如果在主UI线程上同步进行Web服务调用,则可以正常工作。
然而,由于我正在调用Web服务,它需要通过AsyncTask或类似方式异步完成以避免ANR等。通过onCreateContextMenu中的menu.add()对菜单进行异步更新不起作用,即对menu.add()的异步调用不会导致显示上下文菜单。另请注意,异步菜单更新是通过AsyncTask的onPostExecute在UI线程上完成的。
答案 0 :(得分:2)
所有Ui更新都必须在UI线程上完成。所以你必须将一个runnable发布到Ui线程上。 像
这样的东西runOnUiThread(new Runnable() {
public void run() {
//DO UI update here
}
});
或者您必须在Asynctask的doinBackground函数中调用publishprogress(),然后在onProgressUpdate()上执行Ui。 如果Ui更新可以等待,您应该在OnPostExecute
中执行此操作答案 1 :(得分:1)
感谢那些已经提供答案的人,我可能不得不暂时离开这个问题。对于那些遇到同样问题的人来说,我当前的解决方案使用活动中的openContextMenu(View视图)方法来回调onCreateContextMenu。一个简单的布尔状态标志确定是执行异步调用还是使用先前异步调用中的数据填充菜单。这种设计对我来说有点尴尬和脆弱,但有效。
答案 2 :(得分:0)
保存信息,您可以从活动中的Web服务获取。然后在onPrepareContextMenu()中使用此信息来更新菜单。在显示上下文菜单之前调用onPrepareContextMenu()。 OnCreateContentMenu()仅为每个活动实例调用一次。