/* M式编程@小目标 */
### M式编程规范
步骤:1.理清需求 2.设计数据结构和算法 3.对算法进行M化.
& 设计数据结构包括类的设计,数据库的设计,接口的设计等;
& 算法是解决问题的各种策略,可借助于数学等各学科知识;
& 代码要求:函数粒度不超过20行,高内聚,低耦合。
=======================================================
### Android Studio编译优化
$ studio.vmoptions
-Xms512m
-Xmx4096m
-XX:MaxPermSize=2048m
-XX:+HeapDumpOnOutOfMemoryError
-Dfile.encoding=UTF-8
$ gradle.properties
#开启守护进程
org.gradle.damen=true
##开启并行编译
org.gradle.parallel=true
##启用新的孵化模式
org.gradle.configureondemand=true
##配置编译时的虚拟机大小
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
$ 编译设置项
### 旋转动画
RotateAnimation ra = new RotateAnimation(
0f, -180f, // 开始, 结束的角度, 逆时针
Animation.RELATIVE_TO_SELF, 0.5f, // 相对的x坐标点(指定旋转中心x值)
Animation.RELATIVE_TO_SELF, 1.0f); // 相对的y坐标点(指定旋转中心y值)
ra.setDuration(500);
ra.setFillAfter(true); // 设置动画停留在结束位置
ra.setStartOffset(delay); // 设置动画开始延时
ra.setAnimationListener(new MyAnimationListener()); // 添加监听
layout.startAnimation(ra);
### 文件操作
// 保存数据
File file = new File("/data/data/com.itheima.login/info.txt");
FileOutputStream fos = new FileOutputStream(file);
String info = qq + "##"+ pwd;
fos.write(info.getBytes());
fos.close();
// 读取数据
File file = new File("/data/data/com.itheima.login/files/info.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String info = br.readLine();
### Android Studio运行加速和优化
& 修改此文件: studio64.vmoptions
-Xms2048m
-Xmx2048m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=1024m
### MVP模式详解
MVP(Model-View-Presenter,模型-视图-表示器)模式则是由IBM开发出来的一个针对C++和Java的编程模型,大概出现于2000年,是MVC模式的一个变种,主要用来隔离UI、UI逻辑和业务逻辑、数据。也就是说,MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
(1) View :负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
(2) View interface :需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
(3) Model :负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
(4) Presenter :作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
### EventBus
EventBus是由greenrobot 组织贡献的一个Android事件发布/订阅轻量级框架。EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
发布消息:EventBus.getDefault().post(new MessageEvent(“name”,”password”));
接收消息:可以有四种线程模型选择
@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEventBus(MessageEvent event){
tv_result.setText("name:"+event.name+" passwrod:"+event.password);
}
### RxAndroid教程
RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(订阅者)。Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西,触摸事件,web接口调用返回的数据等等。
在观察者模式中,必须实现两个关键的 RxJava 接口:观察者 Observer 和被观察者 Observable。当被观察者的状态改变,所有订阅了的观察者对象都会被通知。
Observable 接口有一个 subscribe() 方法,每个观察者调用这个方法来订阅通知。
在 Observer 接口中有 3 个方法会被 Observable 调用:
onNext(T value) 方法:提供一个类型为 T 的新对象给观察者
onComplete() 方法:当被观察者发送完这个对象之后通知给观察者。
onError(Throwable e) 方法:通知观察者被观察者发生了一个错误。
### Otto使用姿势
Android事件总线,使用这个库可实现组件之间的通信.
Bus – 管理注册、注销和发布事件
@Produce – 标记该方法是生产者,产生的事件内容为该方法的返回值
@Subscribe – 标记该方法是订阅者,表示订阅了一个事件,方法需要修饰符为public,而区分不同的订阅者是通过方法的参数来区分的,且订阅了某事件的所有订阅者都可以收到该事件
register(Object obj) – 注册,订阅事件前都需要注册
unregister(Object obj) – 注销,放弃之前所有事件的订阅
post(Object event) – 发布一个事件,这个事件会被所有标记了@Subscribe注解的方法获得
### GreenDAO的使用
GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣。它减轻开发人员处理低级数据库需求,同时节省开发时间。 SQLite是一个令人敬畏的内嵌的关系数据库,编写SQL和解析查询结果是相当乏味和耗时的任务。通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”),GreenDAO可以将它们从这些映射中释放出来,这样,您可以使用简单的面向对象的API来存储,更新,删除和查询数据库。
简单的讲,GreenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
关键步骤:创建好@Entity注解的实体类后,在Gradle中找到greendao<脚本>并且build,程序将会对实体代码进行标准化.
会自动创建下面三个类在你指定的包下面: <真几巴强大,简直受不了!!!>
DaoMaster: 定义了数据库创建和操作的方法。
DaoSession: 提供用于访问数据库的 DAO 类。
UserDao: 封装用户表,并为其定义查询等操作。
& 插入一条数据
mDaoSession = new DaoMaster(new DaoMaster.DevOpenHelper(this,DATABASE_NAME).getWritableDb()).newSession();
UserBean userBean = new UserBean(1L,"cmc","123456",24);
mDaoSession.getUserBeanDao().insert(userBean);
### FastJson操作数据
//将对象转为json串7 String json=JSON.toJSONString(student);8 Log.e("ObjectToJson",json);
//将json转为对象 参数1json 参数2对象类型2 Student student=JSON.parseObject(json,Student.class);
只有一句话 就完成了 简单到爆有没有 感谢马云粑粑!!!
### okhttp使用指南
在使用OKHttp之前,首先要先了解如下几个比较核心的类:
OkHttpClient:客户端对象
Request:访问请求,Post请求中需要包含RequestBody
RequestBody:请求数据,在Post请求中用到
Response:即网络请求的响应结果
MediaType:数据类型,用来表明数据是json,image,pdf等一系列格式
client.newCall(request).execute():同步的请求方法
client.newCall(request).enqueue(Callback callBack):异步的请求方法,但Callback是执行在子线程中的,因此不能在此进行UI更新操作
public void okhttp_get(){
final Request request = new Request.Builder().url("http://www.baidu.com").get().build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("okhttp-GET","网络请求失败");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("success",response.body().toString());
}
});
}
### Android Service使用详解
Service是Android系统中的四大组件之一,主要有两个应用场景:后台运行和跨进程访问。Service可以在后台执行长时间运行操作而不提供用户界面,除非系统必须回收内存资源,否则系统不会停止或销毁服务。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC);需要注意的是,Service是在主线程里执行操作的,可能会因为执行耗时操作而导致ANR.
其他组件调用startService()方法启动一个Service。
其他组件调用bindService()方法绑定一个Service。
### Broadcast使用的一般步骤
1)实现一个广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); } }
2)注册广播
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myBroadcastReceiver = new MyBroadcastReceiver();
registerReceiver(myBroadcastReceiver, intentFilter);
3)发送广播
Intent intent = new Intent("android.net.conn.CONNECTIVITY_CHANGE");
sendBroadcast(intent); // 发送广播
### Butter Knife的使用
& Butter Knife常用于View控件的绑定.
class ExampleActivity extends Activity {
@BindView(R.id.user) EditText username;
@BindView(R.id.pass) EditText password;
@BindString(R.string.login_error) String loginErrorMessage;
@OnClick(R.id.submit) void submit() {
// TODO call server... }
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields... }
}
### RecyclerView的使用
如果你想使用RecyclerView,需要做以下操作:
RecyclerView.Adapter- 处理数据集合并负责绑定视图
ViewHolder- 持有所有的用于绑定数据或者需要操作的View
LayoutManager- 负责摆放视图等相关操作
ItemDecoration- 负责绘制Item附近的分割线
ItemAnimator- 为Item的一般操作添加动画效果,如,增删条目等
可以看到对RecylerView的设置过程,比ListView要复杂一些,这也是RecylerView高度解耦的表现,虽然代码抒写上有点复杂,但它的扩展性是极高的。在了解了RecyclerView的一些控制之后,紧接着来看看它的Adapter的写法,RecyclerView的Adapter与ListView的Adapter还是有点区别的,RecyclerView.Adapter,需要实现3个方法:
①onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
②onBindViewHolder()
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
③getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。
### adb指令集
$ adb devices # 列举当前连接的调试设备
$ adb logcat -c # 清除手机的log buffer
$ adb install ~/Downloads/nzcp5.apk # 安装apk
$ adb push ~/Desktop/temp.trace /sdcard/data/ # 拷贝本地文件到调试设备
$ adb kill-server # 常与adb start-server联用
$ adb shell # 进入调试设备的Shell环境
$ adb tcpip 5555 # 开启远程调试模式
$ adb connect # 通过wifi进行调试
$ adb shell am start # 根据Intent指向启动Activity
### Android常用命令行
$ ps -ef | grep java # 查找指定进程
$ kill -9 进程号 # 彻底杀死某个进程
$ tail -100f catalina.out # 查看倒数100行数据,tail是查阅正在改变的日志文件
$ ssh root@192.168.61.10 # 远程登录
$ java -jar test.jar # 执行jar包
$ curl -I http://www.baidu.com # http请求命令行工具,curl -X GET url,GET请求
$ scp -r root@IP:/home/nzcp.apk /root/Desktop # scp从远端拷贝文件到本地
========================== 附录 ================================
& 抓紧时间积累经验,将任务划分为一个一个的小目标来完成.经验最重要!!!
*** 常用的第三方框架 ***
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.alibaba:fastjson:1.1.68.android'
implementation 'org.greenrobot:greendao:3.2.2'
implementation 'org.greenrobot:eventbus:3.1.1'