Android
文章平均质量分 59
louisgeek
放弃不难,但坚持一定很酷!
展开
-
java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 解决方案
java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 解决方案Fragment闪退复现Handler().postDelayed({ //打开页面后在 5 秒内按 home 或 back val fragment = Fragment() supportFragmentManager.beginTransaction() .replace(R.id原创 2022-02-06 20:35:04 · 3878 阅读 · 0 评论 -
Square OkHttp3 源码解析
https://github.com/square/okhttphttps://square.github.io/okhttp源码基于 3.12.0okhttp3.OkHttpClient#OkHttpClient()public OkHttpClient() { //无参构造就相当于创建了一个空 Builder 对象 this(new Builder());}OkHttpClient(Builder builder) { this.dispatcher = .原创 2021-07-21 17:59:33 · 170 阅读 · 0 评论 -
Android RecyclerView
RecyclerView 常规使用DataItem.javapublic class DataItem { public String id; public String title; public String subtitle; public String content; public int imageResId;}可选实现 Cloneable 接口,可解决后面遇到对象引用问题listitem_image_text.xml<?xml原创 2021-04-26 20:48:36 · 103 阅读 · 0 评论 -
Android 解析 XML 的 3 种方式
HTMLHyper Text Markup Language 超文本标记语言XMLExtensible Markup Language 可扩展标记语言为啥不叫 EML?难道 Ex 读着像 X ?DOMDocument Object Model 文档对象模型解析速度慢,内存占用大一次性读取 XML,把 XML 解析成一个树形结构放入内存中Document 代表整个 XML 文档Element 代表一个 XML 元素Attribute 代表一个元素的某个属性SAXS.原创 2021-04-07 16:51:54 · 120 阅读 · 0 评论 -
Android 后台 Service 和子线程的区别
运行在后台的“后台 Service”和运行在后台的“子线程”有什么区别?后台 Service四大组件之一,自身不提供 UI 元素默认是运行在主线程的,耗时操作需要开子线程,可以选用 IntentService可以不依赖 Activity 存在与否,能做到程序关闭后仍旧能继续执行,能够长时间运行"后台"的概念主要是它不和 UI 打交道,是运行在后台的服务,最多通知前台 UI 更新子线程对应主线程的说法"后台"的概念主要是能够异步运行...原创 2021-04-07 16:50:00 · 419 阅读 · 0 评论 -
Android LayoutInflater 源码解析
1 View.inflate(Context context, @LayoutRes int resource, ViewGroup root)public static View inflate(Context context, @LayoutRes int resource, ViewGroup root) { LayoutInflater factory = LayoutInflater.from(context); return factory.inflate(re原创 2021-03-31 17:51:27 · 244 阅读 · 0 评论 -
Activity setContentView 源码解析
Activity#setContentViewpublic class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCall原创 2021-03-22 23:56:59 · 231 阅读 · 0 评论 -
Android AOP 之 AspectJ 统一处理网络检测
利用 AOP 之 Eclipse AspectJ//采用 AspectJX 来快速配置 Eclipse AspectJ//project gradledependencies { classpath "com.android.tools.build:gradle:4.1.2" //add classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'}plugins {原创 2021-03-19 20:43:23 · 278 阅读 · 0 评论 -
Android 处理 View 重复点击的 4 种方式
1、抽象类//实现 View.OnClickListener 接口public abstract class OnThrottleClickListener implements View.OnClickListener { private static final String TAG = "OnThrottleClickListener"; private static final int SKIP_DURATION = 300;//milliseconds private原创 2021-03-18 14:43:23 · 512 阅读 · 0 评论 -
Android 消息机制
Handler 是什么Handler 怎么用Handler handler= new Handler()覆写 handleMessagehandler.sendMessageActivityThread 的 main() 方法调用了//其实就是 UI线程默认为应用创建 Looper 对象Looper.prepareMainLooper();……//最后调用了Looper.loop();先看 Looper 的 prepareMainLooper 方法-> prepare(fal原创 2021-03-07 23:27:22 · 151 阅读 · 0 评论 -
Android HandlerThread
HandlerThread继承 Thread组合了 一个 Handler 和 Looper流程实例化HandlerThread handlerThread = new HandlerThread("name");启动子线程handlerThread.start() 创建 Handler,传入 handlerThread 的 Looper 进行关联//无参方法已过时Handler workHandler = new Handler(handlerThread.get原创 2021-03-06 19:49:13 · 102 阅读 · 0 评论 -
Android 自定义 View
三类组合现有控件把现有控件组合起来形成一个新的控件继承现有控件在该控件的基础之上添加新功能直接继承 View / ViewGroup流程measure、layout、drawmeasure 测量确认 View 的宽高先测量子view的大小,最后测量自身的大小onMeasure,measureChild,measureChildren,setMeasureDimesiononMeasure(int widthMeasureSpec, int heightMeasure原创 2021-03-03 21:03:25 · 141 阅读 · 1 评论 -
Android Activity 启动模式
launchModel 启动模式standard 标准模式默认模式。每次启动一个Activity都会重新创建一个新的实例singleTop 栈顶复用模式新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,如果新的Activity已经存在但不是位于栈,onNewIntent方法被回调顶,那么新的Activity仍然会重新重建singleTask 栈内复用模式singleInstance 单实例模式启动模式的意义假设一个 Activity 频繁启动原创 2021-02-28 21:32:32 · 117 阅读 · 0 评论 -
Android 总结 ViewPager 中 Fragment 滑动切换、数据保存
/** * FragmentPagerAdapter和FragmentStatePagerAdapter最大的区别就是instantiateItem和 destroyItem实现不一样,如果都重写了2者的效果就基本一样了 * 重写instantiateItem ,destroyItem 滑动切换 Fragment数据保存状态 */public class MyFragmentPagerAdapter extends FragmentPagerAdapter {//public class MyF原创 2021-02-16 17:38:02 · 311 阅读 · 0 评论 -
Android 总结 ViewPager 使用
1 ViewPager + PagerAdapterPagerAdapter/** * Created by louisgeek on 2016/3/23. */public class MyPagerAdapter extends PagerAdapter { private List<View> views; public MyPagerAdapter(List<View> views) { this.views = views;原创 2021-02-16 17:36:12 · 141 阅读 · 0 评论 -
Android 总结 Activity 和 Fragment 交互
Activity 调用 Fragment1 直接调用//findFragmentById 或者 findFragmentByTagif (getSupportFragmentManager().findFragmentById(R.id.a_fragment) instanceof AFragment ){AFragment aFragment = (AFragment ) getSupportFragmentManager().findFragmentById(R.id.a_fragmen原创 2021-02-16 17:35:03 · 218 阅读 · 0 评论 -
Android 总结 Fragment 生命周期
1 完整生命周期11个onAttach——onCreate——onCreateView——onActivityCreated——onStart——onResume——onPause——onStop——onDestroyView——onDestroy——onDetach2 经典场景场景1:第一次启动AA:【onAttach——onCreate —— onCreateView—— onActivityCreated——onStart——onResume】场景2:在A上启动BA:【onP原创 2021-02-16 17:33:32 · 193 阅读 · 0 评论 -
Android Activity 生命周期
1 完整生命周期6个onCreate —— onStart—— onResume——onPause——onStop——onDestory1所有Activity生命周期方法的实现都必须先调用其父类版本。2由于Activity经常会暂停和恢复之间切换,所以onResume和onPause这两个方法应当是轻量级的。3在系统再某种紧急情况下需要回收内存,onStop、onDestory可能不会被调用,因此需要在onPause中把需要长期保存的数据保存起来。2 经典场景场景1:第原创 2021-02-16 17:31:34 · 212 阅读 · 0 评论 -
Android 系统架构
1 安卓系统架构1 Linux Kernel (Linux内核):内存管理,进程管理,网络协议和各种驱动等2 Hardware Abstraction Layer (硬件抽象层) 对Linux内核驱动程序的封装,向上提供接口,屏蔽底层的实现细节。3 Libraries (Android系统运行库层 )Libraries 系统库( c/c++库)系统库提供了系统功能通过Android应用程序框架层为开发者提供服务,其类库的内容主要包含数据库、2D/3D图形处理引擎、多媒体库、数据传输服务等。另外,原创 2021-02-16 17:29:20 · 181 阅读 · 1 评论 -
Android Material Design 控件 NavigationView
1 开始使用compile 'com.android.support:design:25.3.1'2 滑动菜单不覆盖Toolbar <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_pa原创 2021-02-16 16:45:00 · 138 阅读 · 0 评论 -
Android Material Design 控件 Toolbar
1 开始使用compile 'com.android.support:appcompat-v7:25.3.1'去掉默认的Actionbar <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <it原创 2021-02-16 10:02:21 · 152 阅读 · 0 评论 -
Android Material Design 控件 Snackbar
开始使用compile 'com.android.support:design:25.3.1'基本使用Snackbar.make(view, "Snackbar", Snackbar.LENGTH_SHORT).show();加入Action动作Snackbar.make(rootLayout,"Snackbar",Snackbar.LENGTH_SHORT). setAction("点我", new View.OnClickListener() { @Ov.原创 2021-02-16 09:18:20 · 128 阅读 · 0 评论 -
Android Material Design 控件 CardView
开始使用compile 'com.android.support:cardview-v7:25.3.1'常用属性app:cardBackgroundColor 背景颜色app:cardElevation Z轴阴影高度app:cardMaxElevation Z轴的阴影最大高度app:cardUseCompatPadding 是否在不同系统中使用相同的padding值app:cardPreventCornerOverlap 是否阻止圆角被覆盖,默认为true,为了防.原创 2021-02-15 08:40:53 · 196 阅读 · 1 评论 -
Android Material Design 控件 BottomNavigationView
开始使用compile 'com.android.support:design:25.3.1'常用属性android:background : 控件背景 app:itemBackground : 子菜单背景 app:itemIconTint : 图标颜色 app:itemTextColor : 文本颜色 app:menu : 菜单图标颜色选择器app:itemIconTint="@color/seletor_bottom_navi"图标图片选择器menu中ico.原创 2021-02-14 21:32:50 · 138 阅读 · 0 评论 -
Android 布局 SlidingPaneLayout 侧滑菜单面板布局
1 开始使用compile 'com.android.support:support-v4:25.3.1'android:layout_width=“100dp” 展开状态<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap原创 2021-02-14 11:17:58 · 1388 阅读 · 0 评论 -
Android 布局 FlexboxLayout 弹性布局
1 开始使用https://github.com/google/flexbox-layout compile 'com.google.android:flexbox:0.3.0-alpha4'2 常用父布局属性app:flexDirection 设置主轴方向(item的排列方向)row (default): 默认值,主轴为水平方向,从左到右。row_reverse:主轴为水平方向,从右到左。column:主轴为竖直方向,从上到下。column_reverse:主轴为竖直方向,从原创 2021-02-12 10:19:42 · 535 阅读 · 0 评论 -
Android Retrofit2 知识总结
1 开始使用https://github.com/square/retrofit//retrofit:2.3.0 里面引用了 okhttp:3.8.0 compile 'com.squareup.retrofit2:retrofit:2.3.0' //converter-gson:2.3.0 里面引用了 gson:2.7.0 compile 'com.squareup.retrofit2:converter-gson:2.3.0' Retrofit 是遵循 RES原创 2021-02-11 08:13:40 · 429 阅读 · 0 评论 -
Android OkHttp3 知识总结
1 开始使用https://github.com/square/okhttp// okhttp:3.8.0 里面引用了 okio:1.13.0compile 'com.squareup.okhttp3:okhttp:3.8.0'//MockWebServer//testCompile 'com.squareup.okhttp3:mockwebserver:3.8.0'默认客户端String url = "https://github.com/";final OkHttpClien原创 2021-02-10 13:04:19 · 750 阅读 · 0 评论 -
Android Gson 知识总结
1 开始使用https://github.com/google/gsoncompile 'com.google.code.gson:gson:2.8.0'2 基本使用 // Gson gson = new Gson(); // gson.fromJson int anInt = gson.fromJson("111", int.class); // 111原创 2021-02-10 12:57:48 · 270 阅读 · 0 评论 -
Android 基础 Pair 和 ArrayList(HashMap替代)
有时候使用ArrayList的有序功能和HashMap的键值对功能,可以采取ArrayList和Pair搭配使用。实例化 //方法1Pair<Integer,String> pair=new Pair<>(1,"20"); //方法2Pair<Integer,String> pair2=Pair.create(1,"20");方法和属性pair.firstpair.secondequals 进行的是值比较android.support原创 2021-02-10 12:38:34 · 668 阅读 · 0 评论 -
Android 基础 SparseArray 和 ArrayMap (HashMap替代)
在某些情况下他们比HashMap更加高效,对内存也进行了优化,所有可以用来代替HashMap使用例子:SparseArray来替代HashMap<Integer, Object>SparseArray 类针对HashMap【避免了自动装箱的过程】针对HashMap【避免了额外的Entry对象】(省略 android.util.)SparseArray key为int value为Objectandroid.support.v4.util.SparseArrayC原创 2021-02-10 12:36:48 · 165 阅读 · 0 评论