当前位置: 首页 > 知识库问答 >
问题:

在片段中使用上下文的最佳方法

罗宪
2023-03-14
public class BaseFragment extends Fragment {
    public MainActivity activity;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (activity == null && context instanceof  MainActivity) {
            activity = (MainActivity) context;
        }
    }
}


public void replaceFragment(Fragment fragment, FragmentDetail last) {

    fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    boolean push = true;
    if (Validator.isNotNull(last)) {
        push = false;
    }
    /*if(Validator.isNull(last)){
        transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
    }else{
        transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
    }*/
    transaction.add(R.id.frame_container, fragment, fragment.getClass().getName());
    if (Validator.isNull(last) && preferences.getFragmentStack().size() > 0) {
        last = preferences.getFragmentStack().lastElement();
    }
    if (Validator.isNotNull(last)) {
        Fragment f = fragmentManager.findFragmentByTag(last.className);
        if (Validator.isNotNull(f)) {
            f.onPause();
            transaction.remove(f);
        }
    }
    last = new FragmentDetail(fragment.getClass().getName(), getTitle().toString(), preferences.isBack());
    if (preferences.isBack() || preferences.getFragmentStack().size() == 0) {
        if (push) {
            preferences.getFragmentStack().push(last);
        }
    } else {
        while (preferences.getFragmentStack().size() > 1) {
            preferences.getFragmentStack().pop();
        }
        if (!preferences.getFragmentStack().lastElement().className.equals(last.className)) {
            preferences.getFragmentStack().push(last);
        }
    }
    transaction.commitAllowingStateLoss();
    changeNavigationIcon();

//hwutil.showtoast(this,fragmentManager.getBackStackEntryCount()+“”);}

在所有其他片段中,我使用活动作为上下文,我的问题是,以这种方式访问上下文是不好的方式,还是会造成内存泄漏。或者任何其他访问上下文的方法..任何帮助都是有用的。

共有1个答案

司徒耀
2023-03-14

我认为html" target="_blank">存储上下文的方式确实是最优的,因为您可以在每个子片段实例中使用它。因为MainActivity是片段中的一个实例变量,所以当片段被销毁时,它将被垃圾回收。如果我没有弄错活动片段生命周期,那么当活动被旋转时,新的片段将被创建,旧的片段实例将被销毁。所以,我们在那里也很好。但是,您需要小心上下文变量声明:

public MainActivity activity;

这使得它可以从任何地方访问。任何类都可以调用context=fragins.activity并将其保存在那里。这将对您非常不利,因为现在它包含了对该上下文变量的引用。现在,当不再需要您的片段时,它将不会被垃圾回收,因为其他类持有对其变量之一的引用。你会发现自己在“内存泄漏镇”。

确保您持有这个变量,并且它的引用不会传递给其他类。因为它在一个超级类中,所以您可以将它定义为:

protected MainActivity activity;
 类似资料:
  • 问题内容: 如何获取片段中的上下文? 我需要用我的数据库其构造函数采用的背景下,但并没有工作,所以我能做些什么? 数据库构造函数 问题答案: 你可以使用,返回与关联的活动。 活动是(自扩展以来)。

  • 我需要保存一个字符串值,这个值每小时都在变化,由一个路由获取,供其他路由使用。我使用的是Spring XML DSL。 我让它工作正常,但它似乎很笨拙。我有一个带有setter和getter的java类来包装字符串,我用: 然后通过另一种途径把它放回体内: 有没有一种不需要定制java类的纯Spring方式在xml中做到这一点?

  • 我是Javascript的新手,我想连接到DB并运行一个脚本。然后得到脚本的结果,按顺序运行函数。如果其中一个函数有任何错误,它应该停止并且不运行其他函数。 我尝试了以下操作:

  • 有人有教程来实现使用支持库v7(appcomat_v7)的片段中的CAB吗? 我不知道该怎么做,我找不到一个教程来解释一个片段中的实现和使用支持库。 谢谢你的阅读。

  • 问题内容: 我创建了一个类,以从PHP文件的JSON编码中检索注释。此类从AsyncTask扩展: 如您所见,我正在尝试在“ doInBackground”过程运行时显示一个ProgressDialog。但是progressDialog构造函数要求一个Context,但我不知道如何提供它。 我从Fragment调用此类,所以无法访问这样的上下文: “主要”活动称为:AndroidViewPager

  • 我试图了解使用android应用程序下载文件的不同方法的利弊。 我找到了几种方法: 自己管理下载(请参阅此代码片段) 使用Android的DownloadManager 使用OKHttp下载文件,如本文所述 有这方面经验的人能告诉我选择一种方式而不是另一种方式的原因吗?