5月2日Android Studio学习笔记

一、代码优化与规范
可空性注解
使用 @Nullable 和 @NonNull 注解来明确变量是否可以为 null,有助于在编译阶段发现潜在的空指针异常问题,提高代码的健壮性。
例如:
java

import androidx.annotation.Nullable;

public class Example {
@Nullable
public String getNullableString() {
return null;
}

public void useString(@NonNull String str) {
    // 使用 str
}

}
资源优化
避免重复的资源文件,及时清理无用的资源,以减小应用的体积和提高资源加载效率。
使用 android:tools:ignore="UnusedResources" 属性(谨慎使用)在布局文件中暂时忽略未使用的资源警告,但最好还是要对资源进行全面的梳理和优化。
二、常用插件与工具使用
Butter Knife 插件
Butter Knife 是一个用于 Android 的视图绑定工具,能够减少样板代码。通过注解的方式快速绑定布局中的视图、处理点击事件等。
安装插件后,添加依赖并配置好,在代码中使用注解如 @BindView 绑定视图,使用 @OnClick 处理点击事件。
例如:
java

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
@BindView(R.id.textView)
TextView mTextView;

@BindView(R.id.button)
Button mButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
}

@OnClick(R.id.button)
public void onViewClicked() {
    mTextView.setText("Button clicked with Butter Knife!");
}

}
Parcelable code generator 插件
用于快速生成实现 Parcelable 接口的代码,方便在 Android 组件之间传递复杂的对象数据。
只需在需要生成代码的类上点击右键,选择插件提供的生成选项,即可自动生成 describeContents、writeToParcel 和 CREATOR 等代码。
三、性能分析与调试
性能分析工具
CPU Profiler :可以监测应用的 CPU 使用情况,包括线程、函数调用等信息,帮助发现性能瓶颈,如过多的 UI 操作、复杂的计算任务等在主线程中执行导致的卡顿问题。
Memory Profizer :用于分析应用的内存使用情况,监测内存泄漏等问题。可以查看对象的分配、引用关系等,通过分析堆转储(Heap Dump)来定位内存泄漏的根源。
Network Profizer :分析应用的网络请求情况,包括请求的频率、大小、耗时等,有助于优化网络连接,减少不必要的网络请求,提高应用在网络操作方面的性能。
Energy Profizer :监测应用的电池耗电情况,了解不同组件和操作对电池的影响,从而优化应用的电池使用效率。
Logcat 的高级使用
除了基本的日志查看功能,Logcat 还可以设置日志级别过滤(如只查看错误日志或警告日志)、按照日志标签过滤、使用正则表达式过滤等,方便在大量日志中快速找到关键信息。
可以通过 Logcat 窗口的 “Filters” 下拉菜单选择或创建自定义过滤器,提高日志分析的效率。
调试窗口
在调试过程中,除了查看变量值,还可以利用调试窗口的 “Variables” 选项卡查看对象的结构和所有属性值,“Watches” 选项卡可以添加自定义表达式,实时计算和查看表达式的结果。
调试窗口的 “Frames” 选项卡显示了当前线程的调用栈信息,可以方便地查看函数调用的层次关系,了解程序的执行流程。
四、布局性能优化
减少布局层次
尽量减少嵌套布局,使用更高效的布局容器,如 ConstraintLayout,它可以在不嵌套的情况下实现复杂的布局结构,降低布局的渲染时间和内存占用。
例如,使用 ConstraintLayout 实现一个包含多个控件的布局,避免使用多个 LinearLayout 或 RelativeLayout 嵌套。
xml

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello, Android Studio!"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Me"
    app:layout_constraintTop_toBottomOf="@+id/textView"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
使用 ViewStub
ViewStub 是一种轻量级的占位符,用于延迟加载布局。当需要显示某个布局时,才进行加载和渲染,从而减少初始布局的加载时间和内存占用。
在布局文件中定义 ViewStub,指定要加载的布局资源 ID 和显示条件等属性,通过在代码中调用 setVisibility 或 inflate 方法来显示布局。
xml


java

// 在代码中显示 ViewStub 的布局
ViewStub viewStub = findViewById(R.id.viewStub);
viewStub.inflate();

posted @ 2025-05-05 22:51  头发少的文不识  阅读(15)  评论(0)    收藏  举报