自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 AndroidStudio中Build很慢的解决方法

AndroidStudio中Build很慢的解决方法

2022-08-18 17:03:16 1629 1

原创 11、JetPack之Navigation

1、背景为什么要使用Navigation呢,因为使用它切换、跳转Fragment,Activity更加的方便Navigation在androidx.navigation下2、基本使用方法2.1创建项目在activity_main中的布局采用FrameLayout,使用androidx.fragment.app.FragmentContainerView其中必须要提供id、name、navGraphandroid:name="androidx.navigation.fragm.

2022-05-22 17:51:39 564 1

原创 10、JetPack之MVVM架构

View:Framgnet/ActivityViewModel:ViweModel是为View管理数据的,也负责业务逻辑处理Model: 对应Repository,处理操作数据,domain等MVVM:尽量不要依赖View 模型驱动界面、独立于View对象和组件,不受View/组件生命周期影响 解决MVC中存在的问题 把逻辑拆分到各个ViewModel里,Activity/fragment只负责UI的绑定和UI事件监听 解决MVP中存在的问题 View层持有ViewMode

2022-05-17 23:36:45 621

原创 9、JetPack之ViewModel

1、介绍ViewModel是一个为view(Activity\Fragment)准备数据和管理数据的类,是业务逻辑类可以看到ViewModel不会被销毁,除非view层不存在了,才会清除掉 2、ViewModel的创建定义OnSellViewMode类继承抽象类ViewModel,这里viewModel层相当于逻辑层,处理相关业务逻辑代码,且不持有view层的引用class OnSellViewModel : ViewModel() { companion object {

2022-05-16 23:50:56 331

原创 8、JetPack之LiveData

1.介绍:LiveData是一种可观察的数据存储器类,LiveData具有生命周期的感知能力,可感知view层生命周期,在数据发生变化的时候(view活跃的时候,销毁时停止更新),可以通知到添加进来的观察者LiveData是个抽象类,主要使用其子类MutableLiveData2.基本使用2.1 observe方法添加观察者首先在逻辑层(后面MVVM架构中在ViewModel层)添加属性,是要监听的数据,放入MutableLiveData容器中其次,一般通过Model层获

2022-05-15 23:14:29 493

原创 7、JetPack之Lifecycle

1.介绍:可以让逻辑层感知到view层的生命周期变化,并进行相应的逻辑处理2.基本使用2.1.1 被动的通知View层生命周期变化让逻辑层拥有LifecycleOwner对象,因为view层实现了LifecycleOwner接口,所以可以在view层初始化的时候,直接赋值,有了LifecycleOwner对象,就可以通过getLifecycle方法获取到Lifecycle对象了2.1.2 有了LifecycleOwner对象,需要在逻辑层获取Lifecycle并添加对应的观察者(addOb.

2022-05-15 17:32:19 329

原创 6、改造MVP--让数据容器也能感知View生命周期变化

ILifecycleOwner接口:提供getLifecycleProvider(): LifecycleProvider,实现该接口可通过getLifecycleProvider()方法获取LifecycleProvider对象package com.example.jetpackbysob.musiclisttestfinal.lifecycle/** * Project_name:JetPackBySob * Created by:ChenFuXu. * Date: 2022/5/.

2022-05-04 22:55:00 1024

原创 5、改造MVP--让P层感知到V层生命周期的变化

在前面的改造过程中,为了解决多个View调用Presenter时,部分View只需要使用到Presenter的部分功能,采用了数据驱动UI的方式解决 MVP存在异步线程更新UI的问题,采用在监听数据时判断当前是否是UI线程才进行回调这里我们需要进一步解决剩余的问题:更新UI的时候需要结合当前V层的生命周期进行(在用户可见的情况下进行更新,不可见时就暂停相关的操作)因此,这里首先处理,让View层能够通知到Presenter生命周期的变化这里创建ILifecycle接口,让相应的Present

2022-05-03 22:51:27 304

原创 4、改造MVP--处理异步线程问题

测试音乐列表的功能,在MusicActivity中可以获取音乐列表以及播放状态的数据V层:MusicActivity,测试用来获取音乐列表,控制音乐播放状态package com.example.jetpackbysob.musiclisttest1import android.os.Bundleimport androidx.appcompat.app.AppCompatActivityimport com.example.jetpackbysob.Rimport kotlinx.an

2022-05-03 20:04:00 947

原创 3、改造MVP--让数据改变来通知UI更新

原则:减少/不依赖View 数据驱动UI,在数据变化时,UI自动进行更新目的:View不与Presenter直接关联 确保数据在主线程更新UI 感知View的生命周期 在可见的生命周期范围内数据更新则更新UI,否则不更新UI View不可见时,暂停某些不必要的操作 这里不需要再在Presenter中注册View,也不需要在Presenter中回调View的方法了测试代码:逻辑层接口:用来执行播放状态,以及切换歌曲的方法package com.example.jet

2022-05-03 17:34:11 477

原创 2、MVP架构

在MVC框架中套在Android上并不适用,会导致V层和C层代码越来越多,如果在处理复杂的逻辑时,在Activity中(V层)中代码成千上万行,会导致V层越来越臃肿,于是开始剥离V层和C层的代码。开始将大量的逻辑代码抽取到P层,于是就演化出了MVP架构View:Activity、FragmentPresenter: 逻辑层Model: 数据处理层在MVP架构中,设计到的内容是通过调用逻辑层的方法和更新UI那么如何调研逻辑层的方法,如何通知UI更新呢?首先:View层持有Prese

2022-05-03 15:57:41 881

原创 1、MVC->MVP->MVVM

1、MVC架构1.1 组件的互动1.2 MVC之间的经典PS:注意,是经典合作。不是必须这样做,这只是其中一种合作方式。在不同的项目开发里面,分别有不同的内容充当MVC。那在Android里是什么充当View,什么充当Model,什么充当Controller呢?View:Acitivity(View)、Fragment(View)视图,在android里xml布局转成View后,加载到了Activity/Fragment里了。Controller:Controller对应着A

2022-04-27 22:36:50 1030

原创 As中Kotlin开发不需要findViewById的方法

1、build.gradle(app下的)的dependencies中添加implementation "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"2、build.gradle(app下的)的plugins中添加id 'kotlin-android-extensions'然后同步一下即可...

2022-04-26 23:47:26 1262

原创 实现NavigationBar的两种方式

方式1:使用BottomNavigationView控件xml代码:<!--底部导航栏--> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/main_navigation_bar" android:layout_width="match_parent" android:layout_height="49d

2022-03-27 15:30:32 3353

原创 弹起隐藏键盘

/** * Project_name:TaobaoUnion * Created by:ChenFuXu. * Date: 2022/3/26 20:31 * <p> * 弹起、隐藏键盘工具类 */public class KeyboardUtils { public static void showKeyboard(Context context, View view) { InputMethodManager inputMethodManager =.

2022-03-27 15:20:17 280

原创 将APP变成黑白的颜色

思路:1、我们View的层级是一层嵌套一层的,而绘制的画笔也是由顶层给到下层的。那我们拿到顶部的容器,改它的画笔颜色即可如何拿到最顶部的容器呢?View decorView = this.getWindow().getDecorView();2、画笔要怎么设置?我们可以通过矩阵,设置它的饱和度为0即可 ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); Paint paint = new Paint()

2022-03-27 10:25:47 4814

原创 改写软件盘回车键

1、在xml文件的editText中设置android:imeOptions="actionSearch"属性<EditText android:id="@+id/search_input_box" android:layout_width="match_parent" android:layout_height="30dp" android:layout_centerVertical="true"

2022-03-26 18:05:51 2549

原创 如何解决软键盘顶起了布局

1、在activity中添加如下属性android:windowSoftInputMode="adjustPan"<activity android:name=".ui.activity.MainActivity" android:windowSoftInputMode="adjustPan" > <intent-filter> <action android:name="android

2022-03-26 18:03:03 266

原创 JsonCacheUtil-缓存工具类

/** * Project_name:TaobaoUnion * Created by:ChenFuXu. * Date: 2022/3/20 20:07 * * 缓存工具类 */public class JsonCacheUtil { public static final String JSON_CACHE_SP_NAME = "json_cache_sp_name"; private static volatile JsonCacheUtil sJsonCacheUti.

2022-03-20 21:04:33 124

原创 ToastUtils-Toast工具类

背景:正常情况下,使用原生的Toast时,当多次调用时,容易发生Toast错乱的问题,即多个Toast的时长叠加在一起,造成状态错乱,可以使用如下工具类来解决public class ToastUtils { private static Toast sToast = null; public static void showToast(String tips) { if (sToast == null) { sToast = Toast.ma

2022-03-04 23:02:09 510

原创 androidx和v4包资源冲突解决方法

1.资源冲突会报如下错误Execution failed for task ':app:checkDebugDuplicateClasses'.> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable > Duplicate class android.support.v4.app.INotificationSideChannel foun

2022-03-02 23:40:59 4065

原创 使用NestedScrollView实现整体滑动

使用androidx.core.widget.NestedScrollView包裹的内容能够实现整体的向上移动注:NestedScrollView内部只能包裹一个子view,如果含有多个并列的子view会报错,这时可以将多个并列的子view再嵌套一层布局即可<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

2022-03-02 22:47:39 926

原创 Retrofit的使用

1、github网址:依赖:implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'2、使用方法2.1、创建retrofitRetrofit retrofit = RetrofitCreate.getRetrofit();public class RetrofitCreate { private v

2022-02-19 17:31:12 970

原创 Okhttp的使用

1、github网址:依赖 implementation 'com.squareup.okhttp3:okhttp:4.9.3'2、使用过程2.1、创建一个客户端,类似一个浏览器OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10000, TimeUnit.MILLISECONDS) .build();2.2、创建请求的内容

2022-02-19 17:18:33 492

原创 网络请求总结

1.get请求/** * Host 要访问的主机 * Connection 连接保持,http1.1有,1.0没有这个。keep-alive可以提高效率,在一定时间里不断开tcp连接,进行下一个请求 * Content-Length 内容长度,指的是后面请求正文的数据长度 * Accept 响应内容格式,也就是返回内容格式 * Origin 这个是源(不是标准http里的内容,因为我访问用的是chrome,是chrome加的) * User-

2022-02-19 17:09:18 126

原创 非root情况下访问手机存储位置权限的方法

1.Manifest文件中申请读写外部的权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>2.高版本的需要动态申请权限int checkReadExternalPermission = checkSelfPermission(

2022-02-13 09:35:19 1305

原创 CalculateInSampleSize-计算大图降采样率的方法

/** * 计算降采样率的算法 * @param options * @param maxWidth * @param maxHeight * @return */ public static int calculateInSampleSize(BitmapFactory.Options options, int maxWidth, int maxHeight) { //这里其实是获取到默认的高度和宽度,也就是图片的实际高.

2022-02-08 23:19:49 621

原创 安卓27以上不支持http协议,解决方法

1、android:usesCleartextTraffic="true" 使用铭文传输2、Application中配置android:networkSecurityConfig="@xml/net_work_security_config"方法1:在Application中添加1、android:usesCleartextTraffic="true"方法2: Application中配置android:networkSecurityConfig="@xml/net_work_secur.

2022-02-01 22:54:19 4466

原创 SizeUtils-单位转换工具类

public class SizeUtils { public static int dip2px(Context context, float dpValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }}

2021-12-13 22:28:17 335

原创 倒计时的方法(handler及CountDownTimer)

方法1:使用handlerstep 1:application创建handler,APP需要在Manifest注册/** * Project_name:MainActivity * Created by:ChenFuXU. * Date: 2021/12/11 20:07 */public class APP extends Application { private static Handler sHandler = null; @Override publi

2021-12-12 11:03:22 312

翻译 禁止EditText复制粘贴文本

// ===============禁止EditText中复制粘贴============== @SuppressLint("ClickableViewAccessibility") public void disableCopyAndPaste(final EditText editText) { try { if (editText == null) { return ; } .

2021-12-11 16:54:49 625

原创 RxJava的使用

1、github网址:https://github.com/ReactiveX/RxJava2、添加依赖:implementation "io.reactivex.rxjava3:rxjava:3.x.y"3、使用方法:Observable.create(new ObservableOnSubscribe<Object>() { @Override public void subscribe(ObservableEmitter&

2021-12-07 22:51:48 252

原创 UILoader-工具类

/** * 该类用来帮助对不同的UI界面进行加载 */public abstract class UILoader extends FrameLayout { private View mLoadingView; private View mNetworkErrorView; private View mDataEmptyView; private View mSuccessView; private OnRetryLoadDataListener mOnR.

2021-12-06 23:51:51 168

原创 RoundRectImageView-裁剪圆角图片工具类

/** * Created by TrillGates on 18/10/7. * God bless my code! */public class RoundRectImageView extends AppCompatImageView { // 可以定义裁剪圆角比例roundRatio private float roundRatio = 0.1f; private Path path; public RoundRectImageView(Context .

2021-12-06 23:32:15 103

原创 LoadingView-旋转图片工具类

public class LoadingView extends ImageView { //旋转角度 private int rotateDegree = 0; private boolean mNeedRotate = false; public LoadingView(Context context) { this(context, null); } public LoadingView(Context context, @N.

2021-12-06 23:29:44 72

原创 LogUtil-Log打印工具类

public class LogUtil { public static String sTAG = "LogUtil"; // 控制是否要输出log public static boolean sIsRelease = false; /** * 如果是要发布了,可以在application里面把这里release一下,这样子就没有log输出了 */ public static void init(String baseTag, boolea.

2021-12-06 23:15:02 106

原创 ImageTools-图片格式转换工具类

/** * 图片转换工具类 */public final class ImageTools { /** * Transfer drawable to bitmap 把drawable转换为bitmap * * @param drawable * @return */ public static Bitmap drawableToBitmap(Drawable drawable) { int w = drawable.g.

2021-12-06 23:03:11 3416

原创 ImageBlur-高斯模糊工具类

/** * 高斯模糊工具类 */public class ImageBlur { public static void makeBlur(ImageView imageview, Context context) { BitmapDrawable drawable = (BitmapDrawable) imageview.getDrawable(); Bitmap bitmap = drawable.getBitmap(); Bitmap b.

2021-12-06 22:53:00 123

原创 刷新框架TwinklingRefreshLayout的使用

1、源码github网址:https://github.com/lcodecorex/TwinklingRefreshLayout/2、使用步骤:2.1 添加依赖:implementation 'com.lcodecorex:tkrefreshlayout:1.0.7'2.2 布局中引入TwinklingRefreshLayout,包裹着RecyclerView2.3 根据id找到TwinklingRefreshLayout// 找到刷新控件mRefreshLayo..

2021-11-24 22:49:08 3115 1

原创 绑定服务service

什么是服务呢?长期于后台运行的程序,如果是官方一点,首先它是一个组件,用于执行长期运行的任务,并且与用户没有交互。通过Context.startService()来开启服务,通过Context.stop()来停止服务,还可以通过绑定来开启服务。为什么要使用服务呢?我们知道这个服务是用于执行长期后台运行的操作。有些时候,我们没有界面,但是程序仍然需要工作。比如说,我们播放音乐,在后台播放音乐。比如说,我们下载任务,在后台下载文件。这些都是没有界面 的后台运行程序,这些都是用服务做的。所以,服务

2021-11-02 23:29:39 1068

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除