当活动中的异步任务完成时如何在片段中重新加载ui?
Posted
技术标签:
【中文标题】当活动中的异步任务完成时如何在片段中重新加载ui?【英文标题】:When asynctask in activity finishes how to reload ui in fragment? 【发布时间】:2018-01-03 19:50:22 【问题描述】:我的活动加载一个片段并启动一个 AsyncTask。
class GetParkingAreasAsync extends AsyncTask<String, String, String>
@Override
protected String doInBackground(String... args)
return mRepository.getParkingAreas(mContext.getActiveUser());
@Override
protected void onPostExecute(String value)
for (int i=0; i<mContext.getActiveUser().getParkingAreas().size(); i++)
Log.i(TAG_areas, "parking area " + i +": " + mContext.getActiveUser().getParkingAreas().get(i).getName());
Activity 中的这个 Asynctask 加载了一些数据(我存储在上下文中)。当它完成时,如何在片段中重新加载 UI 以显示加载的数据(在父 Activity 中)?
【问题讨论】:
【参考方案1】:onPostExecute 已经在 UIThread 中运行,所以你只需要你的片段来调用你的 Activity。我通常这样做的方式是为片段定义一个接口。 像这样:
public interface YourFragmentListener
void onParksLoaded(List<String> names)
然后在你的活动上:
public class YourActivity implements YourFragmentListener
@Override
void onParksLoaded(List<String names)
// Do something with the names
yourField.setText(names.get(0))
最后在你的片段中你可以像这样使用它:
@Override
protected void onPostExecute(String value)
((YourFragmentListener) getActivity()).onParksLoaded(value)
当然,您可以更改类型以更好地适应您的用例。请注意演员表,如果您在未实现 YourFragmentListener 的活动中使用此片段,它将引发异常
【讨论】:
【参考方案2】:当你创建片段时,你有他的一个实例 所以你可以做的是 onPostExecute 在你的片段上调用方法
@Override
protected void onPostExecute(String value)
yourFragment.doSomething()
【讨论】:
我不能这样做,因为我不能从 onPostExecute 调用非静态方法(getView() 和 getContext() 都是非静态方法)。而且我在该方法中有另一个无法加载的任务。 为什么不呢?位于您班级中的异步任务? 第二个 asynctask 位于片段中,用于从 ImageView 上的 url 加载图像【参考方案3】:在片段中定义你想要的方法来更新 UI,当异步作业完成后,在父活动中搜索片段并在片段实例上调用该方法
我的片段:
public void refreshUI(String data)
//Do something with data you receive
父活动:
@Override
protected void onPostExecute(String value)
//or you can find it with tag if have any
MyFragment frag = getFragmentManager().findFragmentById(R.id.container);
if(frag != null) frag.refreshUI(value);
【讨论】:
以上是关于当活动中的异步任务完成时如何在片段中重新加载ui?的主要内容,如果未能解决你的问题,请参考以下文章