Android开发知识小集常见bug

Android开发 常见问题

2019-03-01  本文已影响17人  __素颜__

一.集合赋值问题

一般我们从服务器请求到集合时一般赋值这样,然后将数据展示到相应的控件上。

ArrayList<String> mDataList = new ArrayList<String>();

    public void getRespon(ArrayList<String> mServiceDataList) {
        mDataList = mServiceDataList;

    }

这样直接操作数据源,会导致当我们把mDataList集合清空的时候数据源mServiceDataList也同时清空,破坏了源数据,因为两个指向的是一个地址。因此不应该直接操作数据源。

 ArrayList<String> mDataList = new ArrayList<String>();

    public void getRespon(ArrayList<String> mServiceDataList) {
        //1.清空下集合
        mDataList.clear();
        //2.添加集合
        if (mServiceDataList != null) {
            mDataList.addAll(mServiceDataList);
        }
    }

为了避免产生莫名其妙的问题,因此尽量不要破坏传过来的数据。

二.switch 不止可以判断 int

从 Java JDK 1.7 开始,switch 语句就可以开始支持判断 string 对象 和 enum 枚举

 public void localEquals(String testString) {
        switch (testString) {
            case "测试一":
                break;
            case "测试二":
                break;
            case "测试三":
                break;
        }
    }

三. equals方法使用防止空指针

string 中 equals方法可以比较两个内容是否相等

 public void testEquals(String  testString){
       "hello".equals(testString);
   }

如果testString 写在前面

 public void testEquals(String  testString){
       if(testString!=null){
           testString.equals("hello");
       }
   }

第一个方法不用非空判断,而且testString可以为空值。

四. 被 final 修饰的对象不能被修改

我们常常误以为,被 final 修饰对象不能被修改,其实这种说法不是完全正确的。修改这个对象的成员变量是没有任何问题的

 public void testFinal() {
        final ReportAllBean mReportAllBean=new ReportAllBean();
        mReportAllBean.data="测试修改";
    }

但是不能对这个对象进行重新赋值


image.png

五.Java 子父类相互转换

子类转父类
  public void testView() {
        TextView mTextView = new TextView(mActivity);
        View mTextView1 = mTextView;
        mTextView1.setVisibility(View.VISIBLE);

    }

TextView可以转成父类。并且调用setVisibility方法

父类转子类
 public void testView() {
        View mView = new View(mActivity);
        TextView mTextView = (TextView) mView;

    }

运行报ClassCastException
但是findViewById好像返回的就是一个View并且可以转换成子类类型

public void testView() {
        View viewById = mActivity.findViewById(R.id.viewPager);
        ViewPager mViewPager = (ViewPager) viewById;
    }

虽然 findViewById 可以强转成 View 的子类,但是本质获取到的还是 XML 中的那个类型 View,XML 中是 ViewPager,findViewById 获取到也只能是 ViewPager,如果强转成 其他类型 一定会报类型转换异常

父类是可以转成子类的,但是有一个前提条件,那就是它本质上就是这个子类的对象

六.基本数据类型和对象

image.png

基本数据类型和对象之间有很大的区别,基本数据类型只能是一个数值,而对象可以有变量和方法,int 的默认值为0,而 Integer 的默认值为 null,因为它们本身就是两种不同的东西

六.重写和重载

重写:重写父类的方法

 @Override
    public void onPause() {
        super.onPause();
    }

重载:一个类里可以有相同方法名的方法,但是参数不同。

 public void testView() {

    }
 public void  testView(int i) {
    }

七.ListView 或 RecyclerView 使用 Glide

错误写法

Context context = MainActivity.this;

Glide.with(context)
        .load(url)
        .into(imageView);

正确写法

Glide.with(imageView.getContext())
        .load(url)
        .into(imageView);

Glide 使用的上下文建议用 ImageView.getContext() 的,来源于我曾经遇到过的问题,在 RecyclerView 中 itemView 中包含一个 ImageView 对象,用于加载后台的用户头像 URL,但是随着列表的滚动,ImageView 加载的图片会混乱起来,原因是 Glide 持有 Activity 的上下文,只要 Activity 没有 finish,Glide 就不会停止本次读取和加载,如果使用了 ImageView 的上下文,只要 ImageView 不可见就会停止加载

此篇文章来源于玉刚文章《那些年,那些坑》,再加一部分自己遇到的坑。

上一篇 下一篇

猜你喜欢

热点阅读