一、简介

该库是封装了okhttp的标准RESTful风格的网络框架,可以与RxJava完美结合,比Retrofit更简单易用。支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持超时自动重连,支持cookie与session的自动管理,支持四种缓存模式缓存网络数据,支持301、302重定向,扩展了统一的上传管理和下载管理功能。

github地址:https://github.com/jeasonlzy/okhttp-OkGo

什么是304?

二、添加依赖

//默认添加okhttp3.4.1、okio1.9.0
compile 'com.lzy.net:okgo:2.1.4'

三、解锁技能

进行全局配置,一般在 Aplication,或者基类的onCreate方法中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息。如果在Aplication中初始化,需要在清单文件中注册 Aplication

//---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//
HttpHeaders headers = new HttpHeaders();
headers.put("commonHeaderKey1", "commonHeaderValue1"); //header不支持中文
headers.put("commonHeaderKey2", "commonHeaderValue2");
HttpParams params = new HttpParams();
params.put("commonParamsKey1", "commonParamsValue1"); //param支持中文,直接传,不要自己编码
params.put("commonParamsKey2", "这里支持中文参数");
//-----------------------------------------------------------------------------------// //必须调用初始化
OkGo.init(this); //以下设置的所有参数是全局参数,同样的参数可以在请求的时候再设置一遍,那么对于该请求来讲,请求中的参数会覆盖全局参数
//好处是全局参数统一,特定请求可以特别定制参数
try {
//以下都不是必须的,根据需要自行选择,一般来说只需要 debug,缓存相关,cookie相关的 就可以了
OkGo.getInstance() // 打开该调试开关,打印级别INFO,并不是异常,是为了显眼,不需要就不要加入该行
// 最后的true表示是否打印okgo的内部异常,一般打开方便调试错误
.debug("OkGo", Level.INFO, true) //如果使用默认的 60秒,以下三行也不需要传
.setConnectTimeout(OkGo.DEFAULT_MILLISECONDS) //全局的连接超时时间
.setReadTimeOut(OkGo.DEFAULT_MILLISECONDS) //全局的读取超时时间
.setWriteTimeOut(OkGo.DEFAULT_MILLISECONDS) //全局的写入超时时间 //可以全局统一设置缓存模式,默认是不使用缓存,可以不传,具体其他模式看 github 介绍 https://github.com/jeasonlzy/
.setCacheMode(CacheMode.NO_CACHE) //可以全局统一设置缓存时间,默认永不过期,具体使用方法看 github 介绍
.setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE) //可以全局统一设置超时重连次数,默认为三次,那么最差的情况会请求4次(一次原始请求,三次重连请求),不需要可以设置为0
.setRetryCount() //如果不想让框架管理cookie(或者叫session的保持),以下不需要
// .setCookieStore(new MemoryCookieStore()) //cookie使用内存缓存(app退出后,cookie消失)
.setCookieStore(new PersistentCookieStore()) //cookie持久化存储,如果cookie不过期,则一直有效 //可以设置https的证书,以下几种方案根据需要自己设置
.setCertificates() //方法一:信任所有证书,不安全有风险
// .setCertificates(new SafeTrustManager()) //方法二:自定义信任规则,校验服务端证书
// .setCertificates(getAssets().open("srca.cer")) //方法三:使用预埋证书,校验服务端证书(自签名证书)
// //方法四:使用bks证书和密码管理客户端证书(双向认证),使用预埋证书,校验服务端证书(自签名证书)
// .setCertificates(getAssets().open("xxx.bks"), "123456", getAssets().open("yyy.cer"))// //配置https的域名匹配规则,详细看demo的初始化介绍,不需要就不要加入,使用不当会导致https握手失败
// .setHostnameVerifier(new SafeHostnameVerifier()) //可以添加全局拦截器,不需要就不要加入,错误写法直接导致任何回调不执行
// .addInterceptor(new Interceptor() {
// @Override
// public Response intercept(Chain chain) throws IOException {
// return chain.proceed(chain.request());
// }
// }) //这两行同上,不需要就不要加入
.addCommonHeaders(headers) //设置全局公共头
.addCommonParams(params); //设置全局公共参数 } catch (Exception e) {
e.printStackTrace();
} 使用get请求获取数据; /**
* get请求获取数据
* @param url
*/
private void getByOkGo(String url){
OkGo.get(url) // 请求方式和请求url
.tag(this) // 请求的 tag, 主要用于取消对应的请求
.cacheKey("cacheKey") // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
.cacheMode(CacheMode.DEFAULT) // 缓存模式,详细请看缓存介绍
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
mTextView2.setText(s);
}
});
}

post请求获取数据,其中params方法用来添加请求参数,params添加参数的时候,最后一个isReplace为可选参数,默认为true,即代表相同key的时候,后添加的会覆盖先前添加的;

 /**
* post请求
* @param url
*/
private void postByOkGo(String url){
OkGo.post(url)
.tag(this)
.cacheKey("cachePostKey")
.cacheMode(CacheMode.DEFAULT)
.params("method", "album.item.get")
.params("appKey", "myKey")
.params("format", "json")
.params("albumId", "Lqfme5hSolM")
.params("pageNo", "")
.params("pageSize", "")
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
mTextView2.setText(s);
} @Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
mTextView2.setText(e.getMessage());
}
});
}

文件下载,FileCallback具有三个重载的构造方法,文件目录如果不指定,默认下载的目录为 sdcard/download/,文件名如果不指定,则按照以下规则命名:

  • 首先检查用户是否传入了文件名,如果传入,将以用户传入的文件名命名
  • 如果没有传入,那么将会检查服务端返回的响应头是否含有Content-Disposition=attachment;filename=FileName.txt该种形式的响应头,如果有,则按照该响应头中指定的文件名命名文件,如FileName.txt
  • 如果上述响应头不存在,则检查下载的文件url,例如:http://image.baidu.com/abc.jpg,那么将会自动以abc.jpg命名文件
  • 如果url也把文件名解析不出来,那么最终将以nofilename命名文件;
/**
* 下载文件
* @param url 下载地址
* @param destFileDir 保存文件路径
* @param destFileName 保存文件名
*/
private void downLoad(String url, String destFileDir, String destFileName){
OkGo.get(url)//
.tag(this)//
.execute(new FileCallback(destFileDir, destFileName) { //文件下载时,可以指定下载的文件目录和文件名
@Override
public void onSuccess(File file, Call call, Response response) {
// file 即为文件数据,文件保存在指定目录
} @Override
public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
//这里回调下载进度(该回调在主线程,可以直接更新ui)
//currentSize totalSize以字节byte为单位
}
});
}

大文件上传;

/**
* 多文件上传
* @param url
* @param keyName
* @param files 文件集合
*/
private void uploadFiles(String url, String keyName, List<File> files){
OkGo.post(url)//
.tag(this)//
//.isMultipart(true) // 强制使用 multipart/form-data 表单上传(只是演示,不需要的话不要设置。默认就是false)
//.params("param1", "paramValue1") // 这里可以上传参数
//.params("file1", new File("filepath1")) // 可以添加文件上传
//.params("file2", new File("filepath2")) // 支持多文件同时添加上传
.addFileParams(keyName, files) // 这里支持一个key传多个文件
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
//上传成功
Toast.makeText(getApplicationContext(), "上传成功", Toast.LENGTH_SHORT).show();
} @Override
public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
//这里回调上传进度(该回调在主线程,可以直接更新ui)
mProgressBar.setProgress((int) ( * progress));
mTextView2.setText("已上传" + currentSize// + "MB, 共" + totalSize// + "MB;");
}
});
}

请求加载图片;

/**
* 请求网络图片
* @param url
*/
private void getBitmap(String url) {
OkGo.get(url)//
.tag(this)//
.execute(new BitmapCallback() {
@Override
public void onSuccess(Bitmap bitmap, Call call, Response response) {
// bitmap 即为返回的图片数据
mImageView.setImageBitmap(bitmap);
}
});
}

取消请求。每个请求前都设置了一个参数tag,取消则通过OkGo.cancel(tag)执行。 例如:在Activity中,当Activity销毁取消请求,可以在onDestory里面统一取消;

@Override
protected void onDestroy() {
super.onDestroy(); //根据 Tag 取消请求
OkGo.getInstance().cancelTag(this); //取消所有请求
OkGo.getInstance().cancelAll();
}

其他细节还是多看官方文档,写的还是非常详细的。

四、栗子演示及源码下载

效果演示

下载链接

一、简介

该库是封装了okhttp的标准RESTful风格的网络框架,可以与RxJava完美结合,比Retrofit更简单易用。支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持超时自动重连,支持cookie与session的自动管理,支持四种缓存模式缓存网络数据,支持301、302重定向,扩展了统一的上传管理和下载管理功能。

github地址https://github.com/jeasonlzy/okhttp-OkGo

什么是304?

二、添加依赖

//默认添加okhttp3.4.1、okio1.9.0
compile 'com.lzy.net:okgo:2.1.4'

三、解锁技能

  1. 进行全局配置,一般在 Aplication,或者基类的onCreate方法中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息。如果在Aplication中初始化,需要在清单文件中注册 Aplication。

    //---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//
    HttpHeaders headers = new HttpHeaders();
    headers.put("commonHeaderKey1", "commonHeaderValue1"); //header不支持中文
    headers.put("commonHeaderKey2", "commonHeaderValue2");
    HttpParams params = new HttpParams();
    params.put("commonParamsKey1", "commonParamsValue1"); //param支持中文,直接传,不要自己编码
    params.put("commonParamsKey2", "这里支持中文参数");
    //-----------------------------------------------------------------------------------// //必须调用初始化
    OkGo.init(this); //以下设置的所有参数是全局参数,同样的参数可以在请求的时候再设置一遍,那么对于该请求来讲,请求中的参数会覆盖全局参数
    //好处是全局参数统一,特定请求可以特别定制参数
    try {
    //以下都不是必须的,根据需要自行选择,一般来说只需要 debug,缓存相关,cookie相关的 就可以了
    OkGo.getInstance() // 打开该调试开关,打印级别INFO,并不是异常,是为了显眼,不需要就不要加入该行
    // 最后的true表示是否打印okgo的内部异常,一般打开方便调试错误
    .debug("OkGo", Level.INFO, true) //如果使用默认的 60秒,以下三行也不需要传
    .setConnectTimeout(OkGo.DEFAULT_MILLISECONDS) //全局的连接超时时间
    .setReadTimeOut(OkGo.DEFAULT_MILLISECONDS) //全局的读取超时时间
    .setWriteTimeOut(OkGo.DEFAULT_MILLISECONDS) //全局的写入超时时间 //可以全局统一设置缓存模式,默认是不使用缓存,可以不传,具体其他模式看 github 介绍 https://github.com/jeasonlzy/
    .setCacheMode(CacheMode.NO_CACHE) //可以全局统一设置缓存时间,默认永不过期,具体使用方法看 github 介绍
    .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE) //可以全局统一设置超时重连次数,默认为三次,那么最差的情况会请求4次(一次原始请求,三次重连请求),不需要可以设置为0
    .setRetryCount(3) //如果不想让框架管理cookie(或者叫session的保持),以下不需要
    // .setCookieStore(new MemoryCookieStore()) //cookie使用内存缓存(app退出后,cookie消失)
    .setCookieStore(new PersistentCookieStore()) //cookie持久化存储,如果cookie不过期,则一直有效 //可以设置https的证书,以下几种方案根据需要自己设置
    .setCertificates() //方法一:信任所有证书,不安全有风险
    // .setCertificates(new SafeTrustManager()) //方法二:自定义信任规则,校验服务端证书
    // .setCertificates(getAssets().open("srca.cer")) //方法三:使用预埋证书,校验服务端证书(自签名证书)
    // //方法四:使用bks证书和密码管理客户端证书(双向认证),使用预埋证书,校验服务端证书(自签名证书)
    // .setCertificates(getAssets().open("xxx.bks"), "123456", getAssets().open("yyy.cer"))// //配置https的域名匹配规则,详细看demo的初始化介绍,不需要就不要加入,使用不当会导致https握手失败
    // .setHostnameVerifier(new SafeHostnameVerifier()) //可以添加全局拦截器,不需要就不要加入,错误写法直接导致任何回调不执行
    // .addInterceptor(new Interceptor() {
    // @Override
    // public Response intercept(Chain chain) throws IOException {
    // return chain.proceed(chain.request());
    // }
    // }) //这两行同上,不需要就不要加入
    .addCommonHeaders(headers) //设置全局公共头
    .addCommonParams(params); //设置全局公共参数 } catch (Exception e) {
    e.printStackTrace();
    }
    • 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
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 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
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  2. 使用get请求获取数据;

     /**
    * get请求获取数据
    * @param url
    */
    private void getByOkGo(String url){
    OkGo.get(url) // 请求方式和请求url
    .tag(this) // 请求的 tag, 主要用于取消对应的请求
    .cacheKey("cacheKey") // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
    .cacheMode(CacheMode.DEFAULT) // 缓存模式,详细请看缓存介绍
    .execute(new StringCallback() {
    @Override
    public void onSuccess(String s, Call call, Response response) {
    mTextView2.setText(s);
    }
    });
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  3. post请求获取数据,其中params方法用来添加请求参数,params添加参数的时候,最后一个isReplace为可选参数,默认为true,即代表相同key的时候,后添加的会覆盖先前添加的;

     /**
    * post请求
    * @param url
    */
    private void postByOkGo(String url){
    OkGo.post(url)
    .tag(this)
    .cacheKey("cachePostKey")
    .cacheMode(CacheMode.DEFAULT)
    .params("method", "album.item.get")
    .params("appKey", "myKey")
    .params("format", "json")
    .params("albumId", "Lqfme5hSolM")
    .params("pageNo", "1")
    .params("pageSize", "2")
    .execute(new StringCallback() {
    @Override
    public void onSuccess(String s, Call call, Response response) {
    mTextView2.setText(s);
    } @Override
    public void onError(Call call, Response response, Exception e) {
    super.onError(call, response, e);
    mTextView2.setText(e.getMessage());
    }
    });
    }
    • 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
    • 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
  4. 文件下载,FileCallback具有三个重载的构造方法,文件目录如果不指定,默认下载的目录为 sdcard/download/,文件名如果不指定,则按照以下规则命名:

    • 首先检查用户是否传入了文件名,如果传入,将以用户传入的文件名命名
    • 如果没有传入,那么将会检查服务端返回的响应头是否含有Content-Disposition=attachment;filename=FileName.txt该种形式的响应头,如果有,则按照该响应头中指定的文件名命名文件,如FileName.txt
    • 如果上述响应头不存在,则检查下载的文件url,例如:http://image.baidu.com/abc.jpg,那么将会自动以abc.jpg命名文件
    • 如果url也把文件名解析不出来,那么最终将以nofilename命名文件; 
      /**
      * 下载文件
      * @param url 下载地址
      * @param destFileDir 保存文件路径
      * @param destFileName 保存文件名
      */
      private void downLoad(String url, String destFileDir, String destFileName){
      OkGo.get(url)//
      .tag(this)//
      .execute(new FileCallback(destFileDir, destFileName) { //文件下载时,可以指定下载的文件目录和文件名
      @Override
      public void onSuccess(File file, Call call, Response response) {
      // file 即为文件数据,文件保存在指定目录
      } @Override
      public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
      //这里回调下载进度(该回调在主线程,可以直接更新ui)
      //currentSize totalSize以字节byte为单位
      }
      });
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
  5. 大文件上传;

    /**
    * 多文件上传
    * @param url
    * @param keyName
    * @param files 文件集合
    */
    private void uploadFiles(String url, String keyName, List<File> files){
    OkGo.post(url)//
    .tag(this)//
    //.isMultipart(true) // 强制使用 multipart/form-data 表单上传(只是演示,不需要的话不要设置。默认就是false)
    //.params("param1", "paramValue1") // 这里可以上传参数
    //.params("file1", new File("filepath1")) // 可以添加文件上传
    //.params("file2", new File("filepath2")) // 支持多文件同时添加上传
    .addFileParams(keyName, files) // 这里支持一个key传多个文件
    .execute(new StringCallback() {
    @Override
    public void onSuccess(String s, Call call, Response response) {
    //上传成功
    Toast.makeText(getApplicationContext(), "上传成功", Toast.LENGTH_SHORT).show();
    } @Override
    public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
    //这里回调上传进度(该回调在主线程,可以直接更新ui)
    mProgressBar.setProgress((int) (100 * progress));
    mTextView2.setText("已上传" + currentSize/1024/1024 + "MB, 共" + totalSize/1024/1024 + "MB;");
    }
    });
    }
    • 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
    • 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
  6. 请求加载图片;

    /**
    * 请求网络图片
    * @param url
    */
    private void getBitmap(String url) {
    OkGo.get(url)//
    .tag(this)//
    .execute(new BitmapCallback() {
    @Override
    public void onSuccess(Bitmap bitmap, Call call, Response response) {
    // bitmap 即为返回的图片数据
    mImageView.setImageBitmap(bitmap);
    }
    });
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  7. 取消请求。每个请求前都设置了一个参数tag,取消则通过OkGo.cancel(tag)执行。 例如:在Activity中,当Activity销毁取消请求,可以在onDestory里面统一取消;

    @Override
    protected void onDestroy() {
    super.onDestroy(); //根据 Tag 取消请求
    OkGo.getInstance().cancelTag(this); //取消所有请求
    OkGo.getInstance().cancelAll();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  8. 其他细节还是多看官方文档,写的还是非常详细的。

四、栗子演示及源码下载

效果演示

下载链接

Android框架之路——OkGo的使用的更多相关文章

  1. Android框架之路——GreenDao3.2.2的使用

    一.简介 GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣.它减轻开发人员处理低级数据库需求,同时节省开发时间. SQLite是一个令人敬畏的内嵌的关系数据库,编 ...

  2. App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

    面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...

  3. Android学习之路——简易版微信为例(一)

    这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的).这里主要是和广大园友们聊聊一个 ...

  4. 小猪的Android入门之路 day 1

    小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显 ...

  5. Android学习之路书籍推荐

    Android开发书籍推荐:从入门到精通系列学习路线书籍介绍 JAVA入门书籍: < Introduction to java programming > < Core java & ...

  6. Android高薪之路-Android程序员面试宝典

    Android高薪之路-Android程序员面试宝典

  7. Android 框架简介--Java环境(转)

    ==========================上=========================== 这里简单的介绍了Android的java环境基础,在后面一节中会结合具体的实例来理解这一节 ...

  8. Android学习之路——简易版微信为例(二)

    1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...

  9. 【Android - 框架】之GreenDao的使用

    上一篇博客([Android - 框架]之ORMLite的使用)中介绍了ORMLite的基本使用,今天我们来研究以下GreenDao的使用. GreenDao和ORMLite一样,都是基于ORM(Ob ...

随机推荐

  1. Glide加载圆形图片第一次只显示默认图片

    Glide加载圆形图,又设置了默认图,很多时候第一次加载的时候只显示默认图.下面的方案可以解决.\ Glide.with(AudioDetailActivity.this) .load(cover) ...

  2. 《剑指offer》数值的整数次方

    一.题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.输入 double base, int exponent 三.输出 b ...

  3. 移动端viewport解惑

    我们在做移动端webapp的时候需要设置这么一段: <meta name="viewport" content="width=device-width, initi ...

  4. nginx配置aliyun https

    server { listen 443; server_name www.goforit.com goforit.com; ssl on; ssl_certificate cert/goforit.p ...

  5. 紫书 习题 10-1UVa 111040(找规律)

    通过观察可以得 图可以分成很多个上面一个,中间两个,下面三个的"模板" 这个时候最上面一个知道,最下面得左右知道 那么可以设下面中间为x,左边为a1, 右边为a2, a1a2已知 ...

  6. 【模板】2-SAT 问题(2-SAT)

    [模板]2-SAT 问题 题目背景 2-SAT 问题 模板 题目描述 有n个布尔变量 \(x_1\)​ ~ \(x_n\)​ ,另有m个需要满足的条件,每个条件的形式都是" \(x_i\) ...

  7. Java基础学习总结(15)——java读取properties文件总结

    一.java读取properties文件总结 在java项目中,操作properties文件是经常要做的,因为很多的配置信息都会写在properties文件中,这里主要是总结使用getResource ...

  8. 【翻译自mos文章】私有网络所用的协议 与 Oracle RAC

    说的太经典了,不敢翻译.直接上原文. 来源于: Network Protocols and Real Application Clusters (文档 ID 278132.1) PURPOSE --- ...

  9. [React] Make Controlled React Components with Control Props

    Sometimes users of your component want to have more control over what the internal state is. In this ...

  10. java基础 this keyword!

    为了程序的可读性,通常将一个类中的表示同一属性的变量进行统一的命名.可是这样做又会导致成员变量与局部变量名字冲突导致无法訪问成员变量.为了解决问题,java中引入了this这个keyword!所以th ...