android lint工作机制,Android架构

MVC

mvc model view controller 模式视图控制器

M: 业务逻辑处理

V:处理数据显示的部分

C:Activity处理用户交互的问题,中间桥梁的作用,解耦的作用。

特点:

耦合性低

扩展性好,利于维护

模块职责划分明确

Model层:

//状态的回调

public interface LoginResultListener {

void result(boolean status);

}

//接口

public interface UserModel {

public void login(String name, String password, LoginResultListener listener);

}

//实现类,进行具体的业务操作

public class UserModelImp implements UserModel {

@Override

public void login(String name, String password, LoginResultListener listener) {

//todo进行相关的操作

}

}

view层:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="rao.com.mvc.MvcDemoActivity">

android:id="@+id/til_username"

android:layout_width="368dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

android:layout_marginTop="8dp"

android:hint="用户名"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent">

android:layout_width="match_parent"

android:layout_height="wrap_content"

/>

android:id="@+id/til_password"

android:layout_width="368dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/til_username">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="密码"/>

android:id="@+id/bt_login"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

android:layout_marginTop="8dp"

android:text="login"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/til_password"/>

controller:

public class MvcDemoActivity extends AppCompatActivity {

private TextInputLayout mTilUserName;

private TextInputLayout mTilPassword;

private Button mBtLogin;

private UserModelImp mUserModelImp;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_mvc_demo);

mTilUserName = findViewById(R.id.til_username);

mTilPassword = findViewById(R.id.til_password);

mBtLogin = findViewById(R.id.bt_login);

mUserModelImp = new UserModelImp();

mBtLogin.setOnClickListener(view -> {

mUserModelImp.login(mTilUserName.getEditText().getText().toString(), mTilPassword.getEditText().getText().toString(), new LoginResultListener() {

@Override

public void result(boolean status) {

}

});

});

}

}

在实际的使用过程中xml布局起的作用是十分的有限的,同时Activty需要操作ui和业务逻辑,造成冗余。

MVP

M:依然是业务逻辑和实体类型模型

V:对应于Activity,负责View的绘制以及与用户交互

P:负责完成View于Model间的交互。

de6457657931

mvp和mvc.png

定义model层:

//接口回调

public interface OnLoginListener {

void onLoginResult(int status, User user);

}

//定义业务

public interface IUserBiz {

void login(String username, String password, OnLoginListener listener);

}

//具体的实现类

public class UserBiz implements IUserBiz {

@Override

public void login(String username, String password, OnLoginListener listener) {

// TODO: 2018/3/18 ,进行登录,网络数据等操作

boolean status = true;

if (status) {

listener.onLoginResult(1, new User(username, password));

} else {

listener.onLoginResult(0, null);

}

}

}

view层:

//view相关

public interface IUserLoginView {

String getUsername();

String getPassword();

void showLoading();

void dismissLoading();

void loginStatus(int status);

}

//activity

public class MVPActivity extends AppCompatActivity implements IUserLoginView {

private TextInputLayout mTilUserName;

private TextInputLayout mTilPassword;

private Button mBtLogin;

private ProgressDialog mProgressDialog;

private UserLoginPresenter mUserLoginPresenter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_mvp);

mTilUserName = findViewById(R.id.til_username);

mTilPassword = findViewById(R.id.til_password);

mBtLogin = findViewById(R.id.bt_login);

mProgressDialog = new ProgressDialog(this);

mUserLoginPresenter = new UserLoginPresenter(this);

mBtLogin.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mUserLoginPresenter.login();

}

});

}

@Override

public String getUsername() {

return mTilUserName.getEditText().getText().toString();

}

@Override

public String getPassword() {

return mTilPassword.getEditText().getText().toString();

}

@Override

public void showLoading() {

mProgressDialog.show();

}

@Override

public void dismissLoading() {

mProgressDialog.dismiss();

}

@Override

public void loginStatus(int status) {

//todo,根据操作,去进行响应的跳转

}

}

presenter层:

public class UserLoginPresenter {

private IUserBiz mIUserBiz;

private IUserLoginView mIUserLoginView;

public UserLoginPresenter(IUserLoginView IUserLoginView) {

mIUserLoginView = IUserLoginView;

mIUserBiz = new UserBiz();

}

public void login() {

mIUserLoginView.showLoading();

mIUserBiz.login(mIUserLoginView.getUsername(), mIUserLoginView.getPassword(), new OnLoginListener() {

@Override

public void onLoginResult(int status, User user) {

if (status == 1) {

mIUserLoginView.loginStatus(1);

} else {

mIUserLoginView.loginStatus(0);

}

}

});

}

}

MVVM

View: 对应于Activity和xml,负责View的绘制,以及用户交互。

Model:实体模型,数据存取

ViewModel:负责完成View与Model间的交互,负责业务逻辑。

一把配套使用DataBinding使用,Model与ViewModel双向通信,一般使用数据驱动的方式来实现。view只负责UI操作。

de6457657931

mvvm.png

Android插件化

当业务量大的时候,android的65536方法数的限制。

apk大的时候,动态加载apk:一个宿主的apk,到sd卡中动态的加载apk,

资源加载:通过AssertManagerr类

代码加载 :java中类加载机制

动态加载APk:类加载器,就是将java的字节码加载到虚拟机当中android中有两个重要的

DexClassLoader: 可以从dex文件加载字节码文件,用于动态加载和热更新等。

PathClassLoader:只能加载文件目录下的apk

资源加载:AssertManager反射来加载的

代码加载:反射绑定到activity的生命期,之后在加载

Android热更新

线上检测到严重的 crash

拉出bugfix分支并在分支上修复问题

jenkins构建和补丁生成

app推送或主动拉取文件

将bugfix代码合并到master上

热更新框架:

Dexposed :阿里,基于aop的思想,无需重启,即可修复,通过hook技术,不仅可以修改java方法,还能hook修改android方法,日志记录,性能统计,安全控制,事物处理。(hook基本的方法就是通过hook“接触”到需要修改的api函数入口点,改变它的地址指向新的自定义的函数)

AndFix:阿里,更纯粹的热修护技术,性能较好,工具较完善。

Nuwa:基于dex分包的技术,将dex文件拆分多个dex,编上号,依次加载。

原理:

Android类加载机制

PathClassLoader 加载系统的类,应用类

DexClassLoader 加载Dex文件,apk包

热修复机制

dexElements 会创建dex数组

ClassLoader 会遍历这个数据,根据线上的carch定位到这个dex,将修复好的dex的位置靠前,优先加载这个dex文件。

进程保活

使用场景:定位,推送等等

进程优先级:

前台进程

可见进程(没有前台组件,但是会影响前台界面的进程)

服务进程

后台进程

空进程(缓存)

回收策略:

low memory killer:通过一系列的评分机制,定义进程进行打分,将分数搞的进程判定为bad进程,杀死并释放缓存。(定时检查)

OOM_ODJ:这个阀值,判断进程的优先级,越大进程优先级越低。

保活方案:

系统广播拉活,开机,网络数据变化,不可控制(容易被系统软件禁用)

系统Service机制拉活 :利用的是当系统内存不足而杀掉该Service,可以拉活。杀死Service后,第一5秒拉活,二次10秒后拉活,三次20秒拉活,当Serice被系统拉活三次之后,就不会在被系统进行拉活了。当被安全软件或系统软件静止之后,是不能拉活的。

利用native进程拉活:利用linux的fork机制创建一个进程,监控主进程的存活,这是可以立即对主进程进行拉活。(失效了)

JobScheduler机制拉活,跟native类是,android5.0之后提供的。

帐号同步机制拉活 (不再生效)

UIL

Universe Image Loader图片加载框架

Lint检查

Android Lint是一个静态的代码分析工具,它能够对android项目潜在的bug,可优化的代码,安全性,性能,可用性,可访问性国际化等进行检查。

Lint工作流程:通过配置lint.xml配置,运用lintTool工具,进行相关的额检查

在Src文件目录下,创建lint.xml文件

de6457657931

Lint.png

如果确定java代码写的没有问题,你可以以下的方式使用

//在java代码中的使用,忽略这警告,检查,这是在lint.xml中配置了属性的

@SuppressLint("NewApi")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initView(savedInstanceState);

}

//在xml文件中的使用,当代码执行到这里的时候就会忽略未使用的资源的问题,不会对编译尽心检查

tools:ingnore="UnusedResources"

自定义lint

使用默认的lint检查不能满足需求,在自定义库的使用,某些属性没有配置 BuiltinlssueRegistry

Kotlin

Kotlin一种基于JVM的编程语言

是对java的一种扩展

Kotlin支持函数式编程

Kotlin类与Java类互相调用

定位carch定位的堆栈的问题

安装Kotlin 插件 在android studio安装

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ComboBox 强制转换为大写的方法

最近遇到如何将输入在组合框(ComboBox)中的英文字符转换为大写的问题。 在TextBox中,有CharacterCasing属性,直接设置为Upper即可。但是在ComboBox中没有此属性,所以要另找其他方法。 直觉告诉我,一定是在K…

opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...

想必大家都知道,学习路线图是学习一门新技术的入门指南,让我们对技术有一个大概的了解,并且在学习感到困惑时被指导。所谓不求最好,但求最全。今天在在就给大家带来了一个国外大牛开源的项目 — 「developer-roadmap」&#xff0c…

数据的交换输出【杭电-2016】 附题

/* 数据的交换输出 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54495 Accepted Submission(s): 20688 Problem Description 输入n(n<100)个数。找出当中最小的数&#xff0c;将它与最前面的数交换后输出…

进程速查手册

进程速查手册 什么是系统进程&#xff1f;它能做什么&#xff1f; 进程是程序在计算机上的一次执行活动。当你运行一个程序&#xff0c;你就启动了一个进程。显然&#xff0c;程序是死的(静态的)&#xff0c;进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成…

android画布一闪一闪的,解决Android SurfaceView绘制触摸轨迹闪烁问题的方法

本文分享了解决SurfaceView触摸轨迹闪烁问题的方法&#xff0c;供大家参考&#xff0c;具体内容如下第一种解决SurfaceView触摸轨迹闪烁问题的方法&#xff1a;由于SurfaceView使用双缓存机制&#xff0c;两张画布轮流显示到屏幕上。那么&#xff0c;要存储触摸轨迹并避免两张画…

iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

iOS应用&#xff08;包括移动应用&#xff09;的网络分析&#xff0c;一般采用将移动设备上的流量导入到PC机上&#xff0c;利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法。 总的来说&#xff0c;有以下三种方法&#xff1a;一、在PC上设置网络共享&#xff0c…

开端2(三)

选择行数, if (efGridResult.EFChoiceCount < 1)设为选中,,this.efGridResult[this.efGridResult.Rows.Count - 1, "check_option"] true;取数据, inInfo.SetBlockVal(this.efGridResult);弹出菜单 this.efGridResult.EFAllowMenuNew false;新增一空行 th…

利用DBMS_ADVISOR.TUNE_MVIEW包生成物化视图创建语句

不少人大概和我一样在创建物化视图的时候会犯头痛&#xff0c;怎样合理的改写SQL语句以及添加物化视图日志需要经过慎重精密的考虑。有了DBMS_ADVISOR.TUNE_MVIEW存储过程这个帮手后&#xff0c;极大地方便了DBA或应用设计人员创建和优化物化视图。该TUNE_MVIEW存储过程可以做到…

oracle批量update数据_东方国信大数据面试真题

东方国信学长1Hadoop工程师笔试题&#xff08;金融事业部&#xff09;1&#xff09;技术基础题&#xff08;共十题&#xff0c;每题5分&#xff09;&#xff08;1&#xff09;列举在Linux系统下可以在看系统各项性能的工具&#xff08;区分CPU、内存、硬盘、网络等&#xff09;…

android 搜狗地图包名,搜狗地图(免费语音导航)

权限信息 读取您的USB存储设备中的内容 android.permission.REQUEST_INSTALL_PACKAComGES android.permission.RECEIVE_USER_PRESENT 完全的网络访问权限 android.permission.ACCESS_BACKGROUND_LOCATION 大致位置(基于网络) 精确位置(基于GPS和网络) 查看网络连接 修改或删除您…

eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize128m -XX:MaxNewSize512m -XX:PermSize96m -XX:MaxPermSize128m -server -XX:CompileThreshold100 -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatin…

SEC SOC Test Board 在WIN 7下的安装

首先找到“设备和打印机”点击打开 如果你插上了USB线&#xff0c;会看到&#xff0c;安装不成功时会有个“&#xff01;” 双击它&#xff0c;出现 点击“属性”&#xff0c;出现 点击“改变设置”&#xff0c;出现 点击“更新驱动程序”&#xff0c;出现 点击进去&#xff0c…

ora-00054:resource busy and acquire with nowait specified解决方法

当某个数据库用户在数据库中插入、更新、删除一个表的数据&#xff0c;或者增加一个表的主键时或者表的索引时&#xff0c;常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行&#xff08;或者事务已经被锁&#xff09…

吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

电影《喜剧之王》里&#xff0c;周星驰饰演的尹天仇&#xff0c;是一个渴望成为真正的演员&#xff0c;却不断沦为落魄跑龙套的小人物。即便如此&#xff0c;他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会&#xff0c;还在街坊福利社开了个戏剧训练班&#xf…

android常用控件实验报告,ui设计实验报告.doc

ui设计实验报告ui设计实验报告篇一&#xff1a;UI设计实验报告实验项目四&#xff1a;UI设计一、 实验目的和要求1、熟练运用Eclipse软件中的swing设计。2、掌握UI编写的软件。3、能都熟练的进行操作&#xff0c;理解每个按钮的含义并懂得修改参数。4、理解其幕后的Java代码。二…

星期三,今天早上上了四节JS课程,下午听健康讲座,晚上装系统

星期三&#xff0c;今天早上上了四节JS课程&#xff0c;下午听健康讲座&#xff0c;晚上装系统。我想说装系统是最浪费时间的&#xff0c;以前大一的时候&#xff0c;有一段时间喜欢上装系统&#xff0c;我去有时候一个系统装了两三天&#xff0c;因为有很多问题。 ~ 后面就不研…

在欲而无欲,居尘不染尘

僧人竺法深在东晋简文帝处作客&#xff0c;刘尹问&#xff1a;「法师是学道之人&#xff0c;为什么要来官宦之门中走动&#xff1f;」竺法深回答说&#xff1a;「你自见这是朱门高第&#xff0c;在贫道眼里&#xff0c;同走在茅屋草舍间并无任何差别。」   法师的境界&#x…

设置width不生效_关于padding被计算在width中问题——box-sizing相关

前一阵子遇到一个小问题&#xff0c;在同样的样式&#xff08;主要是宽高边距之类的&#xff09;条件下&#xff0c;DIV在移动端和PC端的宽度不一样&#xff0c;排除了绝大多数样式的问题&#xff0c;但是有个比较陌生&#xff0c;就是box-sizing&#xff0c;其实经常看到&…

C# 遍历List 并删除某个元素

1、我们选择用for循环&#xff0c; for(int i0;i { if(list[i]) { list.RemoveAt(i); } } 如果这样循环&#xff0c;肯定不对&#xff0c; {A B C D E F G H} 假设当前遍历到D&#xff08;i3&#xff09;,移除&#xff0c;接着遍历i4(F), 此时跳过了E&#xff08;i3&a…

android studio不能更新代码,解决Android Studio 和 Android SDK Manager 无法在线更新的问题....

升级时提示 Connection failed. Please check your network connection and try again修改安装目录下bin\studio.exe.vmoptions文件,如E:\Android\android-studio\bin\studio.exe.vmoptions添加内容:-Djava.net.preferIPv4Stacktrue-Didea.updates.urlhttp://dl.google.com/and…