浅谈Android布局XML文件优化与Handler的使用优化

本文介绍了Android开发中布局XML文件的优化方法,包括资源复用技巧,并探讨了如何通过继承和抽象方法改进Handler的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

笔者从毕业之后,就一直从事android开发的相关工作。到目前为止,已有两年有余。不知从什么时候开始,上班的早晨每天都会发大约个把小时浏览相关技术文章。俗话说:熟读唐诗三百会作诗也会吟。是时候也该自己写技术文章了。一来,记录自己在android路上的点滴与成长;二来,为android知识开源贡献一份自己的绵薄之力。废话不多说了,接下来就进入正文阶段。
复制代码

正文阶段

  1. android布局xml优化

      谈到android布局xml文件的优化,工作有一段时间的小伙伴,大脑中会浮现的是LinerLayout使用weight属性,使用Merge标签优化布局结构,还有使用ViewStub标签。。。英雄所见略同,笔者也就是我跟大家想的也一样。不过呢,在这里笔者说的是另外一个层面——资源的复用。比如说图片资源,文本资源。
      小伙伴们注意啦,睁大你们的眼睛看看下面几个布局xml文件场景。
          场景一
              <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:background="@drawble/xxxx"
                 android:layout_marginTop="@dimen/marpad_30"
                 android:orientation="horizontal">
    
               <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="@string/filename"
                  android:textSize="@dimen/font_25"/>
    
              <TextView
                 android:id="@+id/file_name"
                 android:layout_width="@dimen/space_310"
                 android:layout_height="wrap_content"
                 android:ellipsize="middle"
                 android:singleLine="true"
                 android:textSize="@dimen/font_25"/>
             </LinearLayout>
          场景二
             <LinearLayout
                 android:layout_width="100dp"
                 android:layout_height="wrap_content"
                 android:background="@drawble/xxxx"
                 android:layout_marginTop="@dimen/marpad_30"
                 android:orientation="horizontal">
    
               <Button
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="@string/filename"
                  android:textSize="@dimen/font_25"/>
    
              <TextView
                 android:id="@+id/file_name"
                 android:layout_width="@dimen/space_310"
                 android:layout_height="wrap_content"
                 android:ellipsize="middle"
                 android:singleLine="true"
                 android:textSize="@dimen/font_25"/>
             </LinearLayout>
          场景三
             <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="500dp"
                 android:background="@drawble/xxxx"
                 android:layout_marginTop="@dimen/marpad_30"
                 android:orientation="horizontal">
    
               <Button
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="@string/filename"
                  android:textSize="@dimen/font_25"/>
    
              <Button
                 android:id="@+id/file_name"
                 android:layout_width="@dimen/space_310"
                 android:layout_height="wrap_content"
                 android:ellipsize="middle"
                 android:singleLine="true"
                 android:textSize="@dimen/font_25"/>
             </LinearLayout>
          吧啦吧啦。。。。。
      诸如此类。细心的小伙伴会发现了一个现象。就是顶层Layout布局文件都使用了同一张资源文件做背景,并且它们的宽和高都不相同。重复相同的工作,比较枯燥,必须也无味。那我们这时该怎么办呢?聪明的小伙伴已经想到了idea,那就是layout布局复用与图片资源复用。具体的做法就是,写一个类继承Layout,然后在Layout中设置背景图片。接下来,我们用自定义后的Layout替换顶层Layout布局就ok啦。
      相关的代码如下文所示:
             
            package com.xxx.xxx.defineview;
            import xx.xx.xx.R;
            import android.content.Context;
            import android.util.AttributeSet;
            import android.widget.LinearLayout;
    
            public class XmlBgLinearLayout extends LinearLayout {
    
               public XmlBgLinearLayout(Context context) {
                  this(context,null);
               }
    
              public XmlBgLinearLayout(Context context, AttributeSet attrs) {
                 this(context, attrs,-1);
              }
    
           public XmlBgLinearLayout(Context context, AttributeSet attrs, int defStyle) {
     
              super(context, attrs, defStyle);
              this.setBackgroundResource(R.drawable.xxx);
            }
        }
      
      看到自定义的Layout,有的小伙伴可能会有疑问,为啥木有重写onMeasuer()方法测量Layout中子View的大小,以及重写onLayout()方法重新布局每一个子View。笔者一开始也是这么想的,后来实测发现,效果都是一样的。凡事从简,所以就木有必要了哦。布局xml优化,先谈到这里。下面我们聊聊Handler的优化。
    复制代码
  2. handler的使用优化

      关于Handler,其他的就先不多说了。下面先贴上goolge官方推荐使用的代码。
    
      private static class MyHandler extends Handler {
    
         private final WeakReference<Activity> mActivity;
    
         public MyHandler(Activity activity) {
    
           mActivity = new WeakReference<MainActivity>(activity);
         }
    
         @Override
         public void handleMessage(Message msg) {
           if (mActivity.get() != null) {
    
                //todo...
           }
        }
      }
     这里定义的是静态类,一般也是定义在类的内部。换言之,就是小伙伴们常挂嘴边的静态内部类Handler。再来就是用到了弱引用WeakReference。使用弱引用的优点就是当系统内存紧张的时候,虚拟机会自动回收这部分占用内存的对象。static静态修饰的类的好处就是随着类的加载(而不是随着对象的产生)而产生变量,以致可以用类+静态成员名直接获得。也就是说减少了对象的创建。回顾了些java静态内部类和WeakReference的知识点,回到正题,谈谈我们怎么优化上面的代码。可能有小伙伴会问,上面的代码不是挺好的么,还有什么可优化呢?上面的代码中,假设我们在一个Activity或者Fragment中需要创建多个Handler,那是不是就要创建多个WeakRefrence。笔者就遇到这用情况,要写多个Handler,为了更好的明确类作用。问题来了,每次都要创建Handler都要创建一个WeakRference。这就是我们优化的地方。墨迹了那么多,还是先上代码:
           package xx.xx.xxx.xxx;
           import java.lang.ref.WeakReference;
           import android.app.Fragment;
           import android.os.Handler;
           import android.os.Message;
    
           public abstract class BaseHandler<T extends Fragment> extends Handler {
    
             protected WeakReference<T> mFragmentRefs;
    
             public RadioBaseHandler(T fragment) {
     
               mFragmentRefs = new WeakReference<T>(fragment);
            }
    
            @Override
            public void handleMessage(Message msg) {
     
              super.handleMessage(msg);
     
              T fragment = mFragmentRefs.get();
              if (fragment == null) {
     	
     	        return;
             }
     
             toHandleMessage(fragment,msg);
          }
    
          public abstract void toHandleMessage(T fragment,Message msg);
       }
       这样,使用静态内部类Handler的使用,只需继承BaseHandler以及实现相关的方法,免去了每次都要创建WeakRefrence。前进了一小步,有木有。。。好了,这次就写到这里了。
    复制代码

写在后面

严格意义上的说,这是笔者第一次写技术博客。笔者也曾想过,会不会误人子弟?关于这个问题我刚刚有了答案。尽信书,不如无书。我们要有自己的想法和观点,大胆假设,小心求证。接下来,我想说的是笔者技术还需提高,也在提高,有一些不足之处,在所难免,欢迎广大小伙伴骚扰指正。我们一起成长,一起进步。莫名地想起乔布斯的一句话:(Stay Hungry)保持饥饿,(Stay Foolish)虚愚求教。共勉。复制代码

转载于:https://juejin.im/post/5a5780c6518825692262fa3e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值