【问题标题】:When asynctask in activity finishes how to reload ui in fragment?当活动中的异步任务完成时如何在片段中重新加载ui?
【发布时间】: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 中)?

【问题讨论】:

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


    【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多