三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

YiZhi项目实战:解决Android开发中常见的15个问题

YiZhi项目实战:解决Android开发中常见的15个问题

YiZhi项目实战:解决Android开发中常见的15个问题

【免费下载链接】YiZhiMVP+RxJava2+Retrofit2+Glide+Rxbus,主要实现日报、新闻、干货、影视等资讯,个人项目项目地址: https://gitcode.com/gh_mirrors/yi/YiZhi

YiZhi是一个基于MVP+RxJava2+Retrofit2+Glide+Rxbus架构的Android资讯类应用,主要实现日报、新闻、干货、影视等内容展示。本文将通过分析该项目的源码实现,总结Android开发中15个常见问题的解决方案,帮助开发者快速掌握实用开发技巧。

一、架构设计与MVP模式实践

MVP架构是Android开发中常用的设计模式,能有效分离业务逻辑与视图层。YiZhi项目通过BaseMVPCompatFragment和BaseMVPCompatActivity实现了MVP模式的基础封装,解决了传统MVP模板代码冗余的问题。

// 基础MVP Fragment实现 public abstract class BaseMVPCompatFragment<P extends BasePresenter> extends BaseCompatFragment { protected P mPresenter; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPresenter = createPresenter(); if (mPresenter != null) { mPresenter.attachView(this); } } protected abstract P createPresenter(); @Override public void onDestroy() { super.onDestroy(); if (mPresenter != null) { mPresenter.detachView(); mPresenter = null; } } }

在具体业务场景如GankIoFragment中,通过泛型指定Presenter类型,实现了视图与逻辑的清晰分离:

public class GankIoFragment extends BaseMVPCompatFragment<GankIoMainContract.GankIoMainPresenter> { // 只需关注视图相关实现,业务逻辑由Presenter处理 }

图:Android开发中MVP架构模式示意图,通过分离视图与逻辑提高代码可维护性

二、网络请求优化与数据处理

1. Retrofit2+RxJava2组合使用

YiZhi项目通过RetrofitCreateHelper工具类,统一配置网络请求参数,解决了网络请求管理混乱的问题:

public class RetrofitCreateHelper { public static <T> T createApi(Class<T> service) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(ApiConstants.API_GANKIO_BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(OkHttpHelper.getOkHttpClient()) .build(); return retrofit.create(service); } }

2. 统一线程管理

通过RxHelper工具类封装线程调度,避免了重复编写线程切换代码的问题:

public class RxHelper { public static <T> ObservableTransformer<T, T> rxSchedulerHelper() { return upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } }

三、图片加载与优化

1. Glide图片加载最佳实践

YiZhi项目广泛使用Glide加载图片,并通过封装解决了图片加载中的内存泄漏、占位符设置等问题:

// 图片浏览Activity中的Glide使用 Glide.with(ImageBrowseActivity.this) .load(mImageUrl) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(new GlideDrawableImageViewTarget(pvPic) { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) { super.onResourceReady(resource, animation); // 图片加载完成后的操作 progressBar.setVisibility(View.GONE); } });

2. 避免图片加载导致的OOM

在MovieDetailAdapter等适配器中,通过设置placeholder和合理的图片尺寸,有效避免了OOM问题:

Glide.with(mContext) .load(item.getImages().getLarge()) .crossFade(300) .placeholder(R.mipmap.img_default_movie) .into((ImageView) helper.getView(R.id.iv_movie_photo));

四、列表优化与滑动性能

1. RecyclerView加载更多处理

在GankIoWelfareFragment等列表页面中,通过合理的加载更多逻辑处理,解决了列表滑动卡顿和无限加载问题:

// 解决加载更多逻辑问题 mRvWelfare.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (!isLoading && !isNoMoreData && lastVisibleItem + visibleItemCount >= totalItemCount && dy > 0) { isLoading = true; mPresenter.loadMoreData(); } } }); // 关键:先调用loadMoreComplete,避免无限显示加载item mAdapter.loadMoreComplete(); mPresenter.loadMoreData();

2. 避免RecycleView初始焦点问题

在布局文件中通过设置focusable属性,解决了RecycleView初始获取焦点导致的滚动问题:

<!-- activity_book_detail.xml --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical"> <!-- 避免RecycleView开始的时候获取焦点滚动到底部 --> <android.support.v7.widget.RecyclerView android:id="@+id/rv_book_detail" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>

五、自定义View与布局优化

1. NestedScrollWebView解决高度异常

YiZhi项目实现了NestedScrollWebView自定义控件,解决了WebView在嵌套布局中高度计算异常的问题:

public class NestedScrollWebView extends WebView { // 避免AppBarLayout+NestSrollView+WebView嵌套导致的WebView高度判断异常 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }

2. 圆形头像与图片裁剪

通过ClipViewLayout自定义控件,实现了头像裁剪功能,解决了图片裁剪的复杂逻辑问题:

public class ClipViewLayout extends RelativeLayout { // 处理图片裁剪逻辑 public Bitmap clip() { // 如果宽或高大于屏幕,则控制范围;这里的0.001是因为精度丢失会产生问题 mClipView.setClipRect(mClipRect); return mClipView.clip(); } }

六、RxBus事件总线使用

通过RxBus实现组件间通信,解决了传统Intent和接口回调带来的代码耦合问题:

// RxBus发送事件 RxBus.getDefault().post(new RxEventHeadBean(RxBusCode.RX_BUS_CODE_HEAD_SETTING, newHeadPath)); // RxBus接收事件 @Subscribe(threadMode = ThreadMode.MAIN) public void receiveHeadPath(RxEventHeadBean event) { if (event.getCode() == RxBusCode.RX_BUS_CODE_HEAD_SETTING) { String newPath = (String) event.getData(); Glide.with(mContext).load(newPath).into(ivPersonalHead); } }

七、混淆与性能优化

在proguard-rules.pro中通过合理的混淆配置,解决了代码安全和性能优化问题:

# 优化不优化输入的类文件 -dontoptimize # 避免混淆泛型 如果混淆报错建议关掉 -keepattributes Signature # 保持Glide相关类不被混淆 -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; }

图:YiZhi应用启动界面,通过合理的性能优化实现快速启动

八、异常处理与兼容性

1. 空指针异常处理

在MovieDetailAdapter中通过判空处理,避免了空指针异常:

@Override protected void convert(BaseViewHolder helper, PersonBean item) { if (item != null && item.getAvatars() != null) { // 避免空指针异常 Glide.with(mContext).load(item.getAvatars().getLarge()).crossFade().into((ImageView) helper.getView(R.id.iv_avatar)); } }

2. WebView长按事件处理

在BaseWebViewLoadPresenter中处理WebView长按事件,解决了链接、图片等不同类型点击的处理问题:

case WebView.HitTestResult.PHONE_TYPE: // 处理拨号 callPhone(uri.getQuery()); break; case WebView.HitTestResult.EMAIL_TYPE: // 处理Email sendEmail(uri.getQuery()); break; case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项 imageUrl = uri.toString(); showPopWindow(imageUrl); break;

总结

YiZhi项目作为一个综合性的Android资讯应用,涵盖了日常开发中常见的各种场景和问题。通过对该项目的分析,我们总结了15个Android开发常见问题的解决方案,涉及架构设计、网络请求、图片加载、列表优化、自定义View、事件总线、混淆优化和异常处理等多个方面。这些实战经验对于Android开发者提升开发效率和应用质量具有重要参考价值。

要开始使用YiZhi项目进行学习,只需执行以下命令克隆仓库:

git clone https://gitcode.com/gh_mirrors/yi/YiZhi

通过深入研究源码和实践这些解决方案,开发者可以快速提升Android开发技能,解决实际项目中遇到的各种问题。

【免费下载链接】YiZhiMVP+RxJava2+Retrofit2+Glide+Rxbus,主要实现日报、新闻、干货、影视等资讯,个人项目项目地址: https://gitcode.com/gh_mirrors/yi/YiZhi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表