添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关于为什么setuservisiblehint会被废弃的原因思考:

这需要涉及到之前写过的一篇文章:性能优化: 让ViewPager+Fragment模式更流畅

之前总结了几种情景实现Fragment的性能优化问题。
现在提出setuservisiblehint()所不能解决的问题:
下面这段引用摘自第一篇引用的文章。
但是,它说的其实还不全。
老一套的第一套方案:
1.如果我们不去考虑懒加载的情况。还是可以通过setUserVisibleHint来解决很多简单的Fragment显示隐藏的情况。特别是执行了

mViewPager.setOffscreenPageLimit(fragments.size());

这段代码之后。不再会执行fragment的相关生命周期方法的情况。setUserVisibleHint这个方法很多时候依旧是有很多妙用的。

现在说说不能解决的情况。

AndroidX的setMaxLifecycle()方法如果要真正用来做懒加载,依旧会避免不了至少一个会执行onResume()方法。可以解决的方法是对不显示的Fragment使用骨架屏的方式。
而setMaxLifecycle则可以通过配置最大允许的生命周期来限制Viewpager下的Fragment的OnResume()的执行。
核心代码:

 if (showPosition == index) {
      setMaxLifecycle(fragment, Lifecycle.State.RESUMED)
        } else {
            hide(fragment)
            setMaxLifecycle(fragment, Lifecycle.State.STARTED)
	 //获取其中所有的fragment,其他的fragment进行隐藏
    val fragments = fragmentManager.fragments
    for (fragment in fragments) {
        if (fragment != showFragment) {
            hide(fragment)
            setMaxLifecycle(fragment, Lifecycle.State.STARTED)
 

两种方式的对比与总结
老一套的懒加载
优点:不用去控制 FragmentManager的 add+show+hide 方法,所有的懒加载都是在Fragment 内部控制,也就是控制 setUserVisibleHint + onHiddenChanged 这两个函数。
缺点:实际不可见的 Fragment,其 onResume 方法任然会被调用,这种反常规的逻辑,无法容忍。

新一套的懒加载(Androidx下setMaxLifecycle)
优点:在非特殊的情况下(缺点1),只有实际的可见 Fragment,其 onResume 方法才会被调用,这样才符合方法设计的初衷。
缺点:
对于 Fragment 的嵌套,及时使用了 setMaxLifecycle 方法。同级不可见的Fragment, 仍然要调用 onResume 方法。
需要在原有的 add+show+hide 方法中,继续调用 setMaxLifecycle 方法来控制Fragment 的最大生命状态

关于为什么setuservisiblehint会被废弃的原因思考:这需要涉及到之前写过的一篇文章:性能优化:让ViewPager+Fragment模式更流畅。之前总结了几种情景实现Fragment的性能优化问题。现在提出setuservisiblehint()所不能解决的问题:下面这段引用摘自第一篇引用的文章。但是,它说的其实还不全。老一套的第一套方案:1.如果我们不去考虑懒加载的情况。还是可以通过setUserVisibleHint来解决很多简单的Fragment显示隐藏的情况。特别是执行了 //step1:当bug被发现(排除极低偶然性,单次性,开发工具导致) //step2:根据经验判断bug的重现场景,多次测试,直到精准的定位bug //step3:根据重现场景找到对应的代码 //step4:分析区域代码是否会影响到其他功能. //step5:做好数据的备份工作.(做好代码重构和恢复的准备,这样你才能肆无忌惮的捣鼓代码) //step6:修复代码的过程中,你会发现可能有多种解决方案.试着采取不影响主线的解决方案.以免影响到其他的代码. //step7:回顾所有的审查和测试等工作。思考bug的出现原因,避免下次再犯同类型的错误. 2导致原因 //step1 Integer::parseInt Integer类的方法:public static int parseInt(String s) 将此String转换为int类型数据 定义一个接口(Converter),里面定义一个抽象方法 int convert(String s); 定义一个测试类(ConverterDemo),在测试类中提供两个方法 一个方法是 在实际应用中常用的使用场景:异步处理、应用解耦、流量削锋和消息通讯四个场景 场景一:异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式 串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。 并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。 假设三个业务节点每个使用50毫秒钟,不 1. 获取FragmentManager对象: FragmentManager fragmentManager = getSupportFragmentManager(); 2. 开始Fragment事务: FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 3. 创建要跳转的Fragment对象: MyFragment myFragment = new MyFragment(); 4. 调用FragmentTransaction的replace方法,将当前Fragment替换为要跳转的FragmentfragmentTransaction.replace(R.id.container, myFragment); 5. 调用FragmentTransaction的commit方法,提交事务: fragmentTransaction.commit(); 其中,R.id.container是一个FrameLayout,用于显示Fragment的布局容器。 ### 回答2: 在Android中,使用Fragment的一个常见的需求是在一个Fragment中点击某个按钮或者view后跳转到另一个Fragment,也就是所谓的Fragment跳转Fragment。 在实现这个需求之前,需要先明确一些基本概念。在Android中,使用Fragment的最基本的方式是使用FragmentTransaction来进行添加、移除、替换、隐藏等操作。当一个新的Fragment需要被展示时,也就是所谓的Fragment跳转Fragment时,我们需要使用FragmentTransaction来进行以下步骤: 1. 创建要跳转的Fragment实例。 2. 使用FragmentManager获取FragmentTransaction实例。 3. 调用FragmentTransaction的替换方法(replace)来将当前Fragment替换为要跳转的Fragment。 4. 添加到回退栈(addToBackStack)中。 5. 调用FragmentTransaction的提交方法(commit)来提交这一操作。 示例代码如下: FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, new MyFragment()); transaction.addToBackStack(null); transaction.commit(); 在这段代码中,我们使用了SupportFragmentManager来获取了一个FragmentTransaction对象,并将其替换为了新的Fragment,并将其添加到回退栈中。最后,调用了提交方法来提交这一操作。 需要注意的是,在跳转Fragment时,我们也可以传递一些数据给新的Fragment,例如某些参数、对象等。我们可以使用Bundle将这些数据打包传递给新的Fragment。在新的Fragment中,我们可以使用getArguments()方法获取这些数据。 总体来说,Fragment跳转FragmentAndroid中常见的一种场景,使用FragmentTransaction进行操作可以轻松地实现这一需求。在进行操作时,需要注意保存当前状态并添加到回退栈中,以便用户可以使用返回按钮返回上一个Fragment。 ### 回答3: Fragment 跳转 Fragment 是指在一个 Fragment 中通过代码的方式启动另一个 Fragment。在实际开发中,这种方式常常被用于实现页面之间的跳转或者数据的传递等操作。 在 Android 中,Fragment 跳转 Fragment 有多种方式,其中最常用的方式是使用 FragmentManager 开启一个新的 Fragment,具体流程如下: 1. 首先需要获取到 FragmentManager 对象,可以通过 getActivity().getSupportFragmentManager() 方法获取当前 Fragment 所在的 Activity 的 FragmentManager 对象。 2. 创建一个新的 Fragment 对象,这个对象可以在 FragmentManager 中进行管理,在后面我们会用到。 3. 随着 Fragment 的增多,一个问题也就显现出来,如何在父 Fragment 中实现多个 Fragment 之间的切换?这个时候可以选择使用 FragmentTransaction 对象,通过 add()、replace() 等方法实现对 Fragment 的增删操作。 代码实现如下: // 获取 FragmentManager 对象 FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); // 创建一个新的 Fragment 对象 SecondFragment fragment = new SecondFragment(); // 开启一个事务 FragmentTransaction transaction = fragmentManager.beginTransaction(); // 通过 add()、replace() 等方法实现对 Fragment 的增删操作 transaction.replace(R.id.container, fragment); transaction.addToBackStack(null); // 提交事务,启动 Fragment transaction.commit(); 在这段代码中,R.id.container 表示存放 Fragment 的容器,这个可以根据实际需要进行修改。 同时,我们还需要注意 addToBackStack() 方法的使用。这个方法可以将当前 Fragment 加入 BackStack 中,也就是将当前 Fragment 放入到一个栈中,方便用户在返回时直接返回到上一个 Fragment。需要注意的是,如果不使用 addToBackStack() 方法,则用户在返回时会直接退出当前 Activity。 总之,Fragment 跳转 Fragment 功能十分重要,能够帮助开发者实现程序中各种场景的操作。通过 Fragment 嵌套来实现页面嵌套,通过 Fragment 之间的跳转来实现页面之间的切换,是 Android 开发中不可或缺的一部分。 解决方案: 安卓打包apk出错 AAPT: error: failed to read PNG signature: file does not start with PNG signature. AS报错:design editor is unavailable until after a successful project sync. wzj_what_why_how: 首先,你需要先排查一下网络状态,如果网络状态异常的话,需要先解决一下网络问题。如果网络无异常,并且你没有翻墙的话,则需要看一下,你是否有依赖了一些第三方库是需要翻墙才来同步成功。如果有,你可以尝试先去掉对应依赖。 AS报错:design editor is unavailable until after a successful project sync. 2301_77997230: 如果都没有呢表情包 bug: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address asso weixin_38120886: 同一台手机,另一个APP,同样的jdbc url 连接没有问题,这个新的App就是连不上,不知道什么原因 ConstraintLayout使用 笔记总结 阿童木咯畈: cool! Android:微信(一):集成、分享 Dorain_Gray: 请问为什么按照FileProvider格式转换成content://之后,微信还是不能分享呀