当活动中的asynctask完成如何重新加载片段中的ui时?

时间:2017-07-27 21:58:20

标签: java android android-fragments android-activity android-asynctask

我的活动加载一个片段并启动一个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中)?

3 个答案:

答案 0 :(得分: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的活动中使用这个片段就会抛出异常

答案 1 :(得分:0)

当你创建片段时,你有一个他的实例 所以你可以做的是onPostExecute来调用片段上的方法

@Override
protected void onPostExecute(String value) {
yourFragment.doSomething()
}

答案 2 :(得分:0)

在片段中定义所需方法以更新UI,当异步作业完成时,在父活动中搜索片段并在片段实例上调用方法

<强> MyFragment

public void refreshUI(String data) {
   //Do something with data you receive     
}

<强> ParentActivity:

@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);
}