当活动中的异步任务完成时如何在片段中重新加载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?的主要内容,如果未能解决你的问题,请参考以下文章

异步任务片段背景数据

我应该在 Fragment 中的啥生命周期状态下执行异步任务?

从片段中调用分离的异步任务类

当前一个片段中的某些任务完成时如何通知另一个片段中的适配器

片段布局加载延迟

导航抽屉异步任务