【问题标题】:how to access a Fragment from the inner AsyncTask如何从内部 AsyncTask 访问 Fragment
【发布时间】:2015-05-14 16:39:21
【问题描述】:

我有一个 Fragment 和内部 AsyncTask 来加载文本:

public class TextReaderFragment extends Fragment {
    LoadTextTask task = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setRetainInstance(true);

        task=new LoadTextTask();
        task.execute();
        ...
    }

    public void renderText() {
        ...
    }

    class LoadTextTask extends AsyncTask<Integer, Void, Boolean> {

        @Override
        protected void onPreExecute() {
            // how to access Fragment or Activity here?
            ProgressBar loader = (ProgressBar) findViewById(R.id.textLoadingProgressBar);
            loader.setVisibility(TextView.VISIBLE);
        }

        @Override
        protected void onPostExecute(Boolean loaded) {
            // how to trigger renderText method defined on TextReaderFragment?
            loader.setVisibility(TextView.GONE);
        }

我不明白我该怎么做:

  1. onPreExecute() 方法访问FragmentActivity 以获取在FragmentActivity 中定义的UI 小部件
  2. onPostExecute()触发TextReaderFragment中定义的renderText()方法?

【问题讨论】:

    标签: java android inner-classes


    【解决方案1】:

    逐点回答:

    • Fragment 可以通过TextReaderFragment.this 访问。
    • Activity 可以通过(MyActivity)getActivity() 访问。
    • 可以使用TextReaderFragment.this.renderText() 调用renderText()

    【讨论】:

    • 谢谢!将AsyncTask放在父类中并在任务完成时调用父类方法是一种常见的方法吗?
    • 确实如此。如果您想避免在任何地方复制粘贴相同的AsyncTask 代码,可以创建一个公共公共类并使用接口或lambdas (Java 8) 来调用ActivityFragment 中定义的方法。 . :)
    【解决方案2】:

    因为你没有声明你的 AsyncTask static 它隐式地引用了它的封闭类。要引用封闭类的实例,您必须使用带有 this 关键字的完全限定类名,或者在您的情况下使用 TextReaderFragment.this

    有关嵌套类如何工作的更详细说明,请参阅this 教程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2013-05-07
      相关资源
      最近更新 更多