• [android]从书中编码方式,看编程思想


    《Android权威编程指南第3版》今天学习到第10章,感叹经验丰富的编程理念——解耦合。

    编程理念肯定是尽可能解除耦合,让代码可以复用,书中多次提到关于参数传递的解耦,这又出现一次。

    本章内容以Fragment为主,讲解如何从Fragment中调用其他Activity并传递参数crime_id。(PS:我以为直接通过FragmentManager加载,没想到还是调用Activity)


    以上为背景,下面代码片段:

    1.从实现RecyclerView的Fragment中,点击标签调用详情显示的Activity。

    public void onClick(View v) {
                Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
                startActivity(intent);
            }

    Holder中的Onclick,注意红色部分,相关代码实现如下:

    private static final String EXTRA_CRIME_ID =
                "com.aocshallo.cp7.crimeactivity.crime_id";
    public static Intent newIntent(Context pageContext, UUID crime_id){
            Intent intent = new Intent(pageContext, CrimeActivity.class);
            intent.putExtra(EXTRA_CRIME_ID, crime_id);
            return intent;
        }

    以上内容完全可以直接录入到Holder当中,但这样带来信息的绑定,因为Holder并不关心你是如何实现的,它关心的是我要给你什么参数,至于实现过程是和Holder没有任何关系的,如果直接写入Holder,Holder就和Activity绑定,不利于解耦。所以,定义了一个静态方法newIntent,它的作用是实现初始化Intent,对相关参数处理(将crime_id存入Extra中),这样做Holder就不用管如果创建一个符合Activity要求的Intent了,因为给Activity一个crime_id,Activity里已经内部处理好了,返回一个Intent,你直接用就行了。至少Intent怎么实现的,Holder不知道也不关心,它只管给参数得到Intent,然后调用。

    对于Activity来讲,只有自己清楚这个crime_id是如何存贮的,因为用也是自己用。使用代码如下:

    protected Fragment createFragment() {
            UUID crime_id = (UUID)getIntent().getSerializableExtra(EXTRA_CRIME_ID);
            return CrimeFragment.newInstance(crime_id);
        }

    这里因为有父类具体实现FragmentManager如何创建、使用。Activity里只要覆盖createFragment方法即可,这里红色代码部分正是用到了上一步存入Extra的crime_id。

    存贮、使用都在Activity内部实现,这样一旦处理方式发生变化,在Activity内部即可完成修正,不影响Holder的调用代码;

    相关方法、常量也只在Activity内容使用,不会暴露给Activity以外的区域,保证了安全性。

    代码中黄底部分,也是利用同样的方法,Activity不关心Fragment如何使用,你自己决定,我给你传Crime_id,你处理就好。

    public static CrimeFragment newInstance(UUID crimeId) {
            Bundle args = new Bundle();
            args.putSerializable(ARG_CRIME_ID, crimeId);
            CrimeFragment fragment = new CrimeFragment();
            fragment.setArguments(args);
            return fragment;
        }

    Fragment里使用Bundle来处理参数传递,通过CrimeLib提取Crime

    @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
            mCrime = CrimeLib.get(getActivity()).getCrime(crimeId);
        }

     优美的思想,带来优美的代码,希望自己以后在编写程序时,注意解耦合。

    ……

  • 相关阅读:
    2.19
    2.16sqlite
    2.14Android6
    2.12Android5
    2.11Android4
    2.09Android3
    2.08Android2
    2.06Android学习
    dpdk bond
    ContainerCreating
  • 原文地址:https://www.cnblogs.com/aocshallo1/p/12503354.html
Copyright © 2020-2023  润新知