[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);
    }

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

……

原文地址:https://www.cnblogs.com/aocshallo1/p/12503354.html