【问题标题】:How to execute AsyncTask on DialogFragment dismiss?如何在 DialogFragment 关闭时执行 AsyncTask?
【发布时间】:2014-05-26 08:54:43
【问题描述】:

我想至少我想做的是在 DialogFragment 被解除时刷新 ListView。整个刷新过程在我的 AsyncTask 中。我发现实际上有很多问题/答案,但对我的情况没有任何帮助。

我试过了:

1)onDismiss 在我的DialogFragment 中,获取AsyncTask 本地类的实例并执行它。但是我遇到了一堆错误,我认为因为我试图创建一个新的 Activity 并且每次对话框被关闭时,实际上没有任何意义,而且会占用大量内存。

@Override
    public void onDismiss(DialogInterface dialog) {
        MainActivity outterObject = new MainActivity();
        MainActivity.LoadApplications buffer = outterObject.new LoadApplications();
        buffer.execute();
    }

2)在 MainActivity 中的 onResume,因为我认为 Activity 在 Dialog 出现时进入状态“暂停”。但它只会在我关闭并再次打开我的应用程序时刷新 ListView。

@Override
    protected void onResume() {
        super.onResume();
        new LoadApplications().execute();
    }

【问题讨论】:

  • 为什么不直接从对话框片段的onclick事件中调用asynctask呢?
  • 我的 AsyncTask 类在显示 ListView 之前做了很多工作,您可以选择很多安装在设备上的应用程序。所以每次点击应用都会让用户等待 3-4 秒,然后才能选择更多应用。这也是我需要在 MainActivity 中调用本地类的第一种情况。
  • 需要更多关于你到底在做什么的信息?
  • 在 dialogfragmet 被解除后更新我的主要活动的 ListView。
  • 你可以通过在你的异步任务中实例化一个进度对话框来显示一个“纺车”,告诉用户正在处理,当处理完成后,你可以继续你的列表视图

标签: android listview android-asynctask dialogfragment


【解决方案1】:

onDismiss 方法中实例化 Activity 是错误的。永远不需要这样做。

您的DialogFragmentActivity 之间似乎需要一种通信方式。这个确切的主题在docs 中有清楚的介绍。在你的情况下,这可能是一个潜在的实现:

interface Refresher {
  void onRefresh();
}

class MainActivity extends Activity implements Refresher {

  // ... 

  void onRefresh() {
    new LoadApplications().execute();
  }  

}

class MyDialogFragment extends DialogFragment {

  private Refresher mRefresher;

  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
      mRefresher = (Refresher) activity;
    } catch (ClassCastException ex) {
      throw new ClassCastException("Activity must implement Refresher interface!");
    }
  }

  @Override
  public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    mRefresher.onRefresh();
  }

} 

【讨论】:

  • 有没有办法多次使用“implements”命令?也许我已经实现了某些东西,或者将来可能会实现任何东西。
  • 您的Activity 可以实现任意数量的接口。如果ABC 是您要在MainActivity 中使用的接口,则语法如下:class MainActivity extends Activity implements A, B, C
  • 非常感谢,对我很有帮助和有用的评论
  • 再次非常感谢。正是我想要的!
  • 没问题,很高兴我能帮上忙。
【解决方案2】:

在你的对话框中试试这个

public class CustomDialogFragment extends DialogFragment
{

    private OnDismissListener onDismissListener;


    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState)
    {
        Dialog dialog = super.onCreateDialog(savedInstanceState);        
        dialog.setOnDismissListener(new DialogInterface.OnDismissListener()
        {
            @Override
            public void onDismiss(final DialogInterface dialog)
            {
                if (onDismissListener != null)
                    onDismissListener.onDismiss();
            }
        });
        return dialog;
    }

    public interface OnDismissListener
    {
        public void onDismiss();
    }

    public void setOnDismissListener(final OnDismissListener onDismissListener)
    {
        this.onDismissListener = onDismissListener;
    }
}

并调用你的活动

myCustomDialogFragment.setOnDismissListener(new FAQDialog.OnDismissListener() {
                    @Override
                    public void onDismiss()
                    {

                    }
                });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2012-06-27
    • 1970-01-01
    • 2020-04-11
    • 2012-01-14
    相关资源
    最近更新 更多