如何在AsyncTask执行完成后显示含TextView的PopupWindow?
问题分析与解决方案
你的问题很典型——AsyncTask是异步执行的,当你调用asyncTask.execute("xxxxx")后,代码会立刻继续执行showPopupWindow(widget),这时候processFinish方法还没被调用,meaning_result根本没拿到异步计算的结果,所以PopupWindow里的TextView自然显示不出正确内容。
正确的做法:把PopupWindow的显示逻辑移到AsyncTask的回调里
既然我们要等异步计算完成后再显示PopupWindow,那直接把showPopupWindow(widget)的调用放到processFinish方法里就可以了,这样就能保证只有当计算结果就绪时,才会弹出窗口并更新TextView的内容。
修改后的代码如下:
public void onClick(View widget) { MyAsyncTask asyncTask = new MyAsyncTask(new AsyncResponse() { @Override public void processFinish(Object output) { meaning_result = (String) output; // 计算完成后,再显示PopupWindow showPopupWindow(widget); } }); asyncTask.execute("xxxxx"); }
额外注意事项
- 确保
showPopupWindow方法内部已经正确使用了更新后的meaning_result来设置TextView的文本; - 如果你的
MyAsyncTask需要持有View的引用,要注意内存泄漏问题,可以考虑使用弱引用(WeakReference)来持有widget或者相关上下文; - 另外,从Android 11开始AsyncTask已经被标记为废弃,如果你是新项目,更推荐使用
Coroutines或者ExecutorService来处理异步任务,但如果是维护旧代码,上面的修改完全可以解决你的问题。
内容的提问来源于stack exchange,提问作者user6456568
相关产品推荐
相关产品推荐

