Mark的私人博客

数风流人物,还看今朝

原文转载自大佬笑等茶凉

1.下载并安装Docker

官方下载地址:https://download.docker.com/mac/stable/Docker.dmg

2.用docker下载镜像,在终端输入:

docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

3.启动oracle镜像作为容器:

docker run -d -p 1521:1521 –name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

4.进入镜像配置

docker exec -it oracle11g bash

阅读全文 »

代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。

为什么要加代码混淆?
不想开源应用,为了加大反编译的成本,但是并不能彻底防止反编译

开启混淆

  • 通常我们需要找到项目路径下app目录下的build.gradle文件
  • 找到minifyEnabled这个配置,然后设置为true即可.
    1
    2
    3
    4
    release{
    minifyEnabled true//是否启动混淆 ture:打开 false:关闭
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    proguard-rules.pro文件的作用
  • 只要在工程应用目录的gradle文件中设置minifyEnabled:true即可。然后我们就可以到proguard-rules.pro文件中加入我们的混淆规则了
    阅读全文 »

Hello World!

  • RxJava1.1.7.jar
    代码演示:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public static void main(String[] args) {
    //第一步、创建被观察者
    Observable<String> mObservable = Observable.create(new OnSubscribe<String>(){
    @Override
    public void call(Subscriber<? super String> subscriber) {
    subscriber.onNext("Hello World!");
    subscriber.onCompleted();
    }
    });

    //第二步、创建观察者
    Subscriber<String> mSubscriber = new Subscriber<String>() {

    @Override
    public void onCompleted() {
    // TODO Auto-generated method stub
    System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable arg0) {
    // TODO Auto-generated method stub
    System.out.println("onError");
    }

    @Override
    public void onNext(String arg0) {
    // TODO Auto-generated method stub
    System.out.println("OnNext:"+arg0);

    }
    };

    //第三步、订阅事件
    mObservable.subscribe(mSubscriber);
    }

    例如代码中所演示的,RxJava的使用就是那么简单,通过订阅事件将被观察者和观察者进行绑定。

    阅读全文 »

长连接推送 ——— WebSocket,XMPP等。

5.长连接推送

Websocket
支持客户端和服务器端的双向通信,而且协议的头部又没有HTTP的Header那么大,于是,Websocket就诞生了!

阅读全文 »

进程间通信 ——— Content Provider ,Broadcast ,AIDL等。

4.进程间通信

Content Provider

Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)。应用程序可以利用Content Provider完成下面的工作

  1. 查询数据
  2. 修改数据
  3. 添加数据
  4. 删除数据
    阅读全文 »

第三方通信 ——— EventBus,rxBus

3. 第三方通信

EventBus主要角色:

Event 传递的事件对象
Subscriber 事件的订阅者
Publisher 事件的发布者
ThreadMode 定义函数在何种线程中执行

阅读全文 »

组件间通信 ——— BroadcastReceiver,接口回调等。

2.组件间通信

BroadcastReceiver广播就不再介绍, 广播传递本身是有安全隐患的,需要设置权限,每一个Activity都要定义、注册,解注册广播无形中加大了工作量和维护成本。已经不适应用在组件间通信。

阅读全文 »

安卓业务层的核心灵魂就是层层的消息传递,今天就来总结一下andorid的应用层的各种消息传递。

1.线程间通讯 ——— Handler,HandlerThread等。
2.组件间通信 ——— BroadcastReceiver,接口回调等。
3. 第三方通信 ——— EventBus,rxBus
4.进程间通信 ——— Content Provider ,Broadcast ,AIDL等。
5.长连接推送 ——— WebSocket,XMPP等。

1.线程间通信

Android通过Handler消息机制来实现线程之间的通讯。

阅读全文 »

dynamic:

是所有Dart对象的基础类型, 在大多数情况下,通常不直接使用它,
通过它定义的变量会关闭类型检查,这意味着
dynamic x = 'hal';x.foo();
这段代码静态类型检查不会报错,但是运行时会crash,因为x并没有foo()方法,所以建议大家在编程时不要直接使用dynamic;

var:

是一个关键字,意思是“我不关心这里的类型是什么。”,系统会自动推断类型runtimeType;

Object:

是Dart对象的基类,当你定义:Object o=xxx;时这时候系统会认为o是个对象,你可以调用o的toString()和hashCode()方法
因为Object提供了这些方法,但是如果你尝试调用o.foo()时,静态类型检查会进行报错;

总结:

综上不难看出dynamic与Object的最大的区别是在静态类型检查上;