Android关于(不用)传递Context的使用

Android关于传递Context的使用,大概是Adapter或者PopupWindow中的传递
2020-05-20添加:此文的目的是为了减少context的传递!

转载注明出处,CSDN第二篇

转眼11月中旬,已经在新公司工作半月,浅浅的说一下,优化真的比新写很难,首先是看别人的代码,框架和逻辑都不一样,其次又是四五年的代码,封装和复用性也不好。其实我自己也是个菜鸟,只是做的项目多一点罢了。

Context在什么情况下使用

Context翻译过来就是上下文,也就是承上启下的作用。
当一个应用创建就会生成Application的context,若想解决context引起的内存泄露问题,就多使用Application的context,因为应用不关闭,这个context就一直存在。
其次是Activity、Service、Fragment中的context,尤其要注意Fragment中的context,获取它要在fragment的onCreate之中,而它的容器Actvivity销毁的时候,Fragment中的context也会跟着销毁。

Context主要用来打开新的Activity、Dialog、Service,发送新的Broadcast,注册新的BroadcastReciver,创建新的View,PopupWindow等等。

Context的传递

那么什么情况下我们会去传递context呢?
当你的listview、gridview或者recycleview绑定一个外部adapter,弹窗工具类中dialog或者popupwindow的封装等等。
下面看一段常用代码:

public class TestAdapter extends BaseAdapter {
	Context mContext;
    ArrayList<String> list;

    public TestAdapter(Context context,ArrayList<String> list) {
    	this.mContext= context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View infate= View.inflate(mContext,R.layout.item_test_list,null);
        TextView text=infate.findViewById(R.id.item_text);
        text.setText(list.get(position));
        return infate;
    }
}

2020-05-20添加:

减去Context的传递

上段代码中就是传入了一个context来创建新的view,而我发现其实不用传入context就可以实现。

public class TestAdapter extends BaseAdapter {
    ArrayList<String> list;

    public TestAdapter(ArrayList<String> list) {
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View infate= View.inflate(parent.getContext(),R.layout.item_test_list,null);
        TextView text=infate.findViewById(R.id.item_text);
        text.setText(list.get(position));
        text.setBackgroundResource(R.color.gray);
        text.setTextColor(parent.getContext().getResources().getColor(R.color.black));
        return infate;
    }
}

2020-05-20添加:

减去Context的传递情景和优点

当需要传递一个view的时候,可以使用减去view.getContext(),传递context的操作。

优点:

1、简化代码,不需要维护context。
2、可以操作view,获取资源也可以
3、可以使用==view.post(new Runnable)==刷新主线程

缺点:

此方法只能在onCreate之后使用,建议在传递view的时候调用

减去Dialog和PopupWindow中的Context传递

我本人呢习惯dialog都放在BaseActivity所以不涉及到context的传递,但是使用PopupWindow的时候我是这么写的:

 public static void showWheelButtom(TextView showView, ArrayList<String> list, PopupListWheel.OnDoneListener listener) {
        final PopupListWheel popupWheel = new PopupListWheel(showView.getContext(), list);
        popupWheel.setOnAddressDoneListener(listener);
        popupWheel.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        showViewEvery(showView.getContext(), popupWheel, showView, Gravity.BOTTOM, true);
    }

这是显示一个列表在最底部的PopupWindow,解决了创建PopupListWheel时候需要的context。

另外的知识点

1、通过反射获取Application的Context

try {    
    Application application = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null, (Object[]) null);    
} catch (Exception e) {    
    e.printStackTrace();
}

2、Activity的xml中的布局view,调用view.getRootView()方法相当于在Activity中调用getWindow().getDecorView(),这种情况下获取到的是同一个根布局。

总结

其实并不是说传context不好,只是我想更简洁代码,能不多传就不多传,前提是你需要传入一个view的时候就可以不用传context了,如果你只需要一个context,还是不建议这样乱写。
或许我这样做也不好,大家有意见可以评论指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值