Android开发笔记

/* 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'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,044评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,360评论 2 44
  • 不要在RecyclerView的控件内容更新中做耗时操作,每个控件理想的就是仅仅进行set操作 在JavaWebs...
    倾倒的吞天壶阅读 402评论 0 0
  • 高买低卖,追求最大的利益:最低点买入,最高点卖出。简单的道理,大家都懂,但是在中间却需要我们掌握许多知识,从而来帮...
    小关_dec3阅读 167评论 0 0
  • 老师: 你的画很特别!斑马也在上课。 学生: 是啊,斑马老师在教小斑马认字,还告诉小斑马:“狮子会吃斑马,你们看到...
    曹老师画室阅读 534评论 2 5