如何高效的使用android okhttp3 使用

20529人阅读
OkHttp(3)
Android(39)
&&&&&&&& OkHttp是一个高效的HTTP库
& & & & & & & ?& 支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求;
& & & & & & & ?& 如果SPDY不可用,则通过连接池来减少请求延时;
& & & & & & & ?& 无缝的支持GZIP来减少数据流量;
& & & & & & & ?& 缓存响应数据来减少重复的网络请求。
l& 官网地址
l& Githut地址
l& 引入依赖
& & & & &compile'com.squareup.okhttp3:okhttp:3.2.0'
&&&&&&&& 以最新的okhttp3为例。
1.&&&Http-GET
1)&&&&&&&&OkHttpClient:新建一个OkHttpClient实例,用于处理请求。
2)&&&&&&&&Request:构建请求参数,如url,请求方式,请求参数,header等。
3)&&&&&&&&Call:生成一个具体请求实例,相当于将请求封装成了任务;两种方式:
& & & & & &①、call.execute(),非异步方式,会阻塞线程,等待返回结果。
& & & & & &②、call.enqueue(Callback),异步方式。
4) & & &Response:结果响应。
final String url = &.cn/data/sk/.html&;
OkHttpClient okHttpClient = new OkHttpClient();
final okhttp3.Request request = new okhttp3.Request.Builder()
& & .url(url)
& & .build();
Call call = okHttpClient.newCall(request); & & &&
call.enqueue(new Callback() {
& & @Override
& & public void onFailure(Call call, IOException e) {
& & & & Log.e(TAG, &onFailure() e=& + e);
& & @Override
& & public void onResponse(Call call, final Response response) throws IOException {
& & & & Log.i(TAG, & onResponse() reuslt=& + response.body().string());
& & ① onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()。
& & ② &Callback的onFailure()及onResponse()运行在非主线程,不能在该方法中直接进行UI操作。
2.&&&Http-POST
POST请求跟Get基本相同,需要增加RequestBody来存储请求的参数信息;在Request.Builder中增加post(RequestBody)调用。
RequestBody requestBody = new FormBody.Builder()
.add(&key&, &value&)
& & .build();
final okhttp3.Request request = new okhttp3.Request.Builder()
& & & & .url(url)
& & & & .post(requestBody)
& & & & .build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
& & @Override
& & public void onFailure(Call call, IOException e) {
& & & & Log.e(TAG, &testHttpPost ... onFailure() e=& + e);
& & @Override
& & public void onResponse(Call call, Response response) throws IOException {
& & & & Log.i(TAG, &testHttpPost ... onResponse() response=& + response.body().string());
& &有时调试需要查看参数信息,可以通过该方式,获取得到参数信息:
public String getParameters(RequestBody requestBody) {
& & & & final Buffer buffer = new Buffer();
& & & & requestBody.writeTo(buffer);
& & & & //
& & & & BufferedInputStream bufferedInputStream = new BufferedInputStream(buffer.inputStream());
& & & & final StringBuffer resultBuffer = new StringBuffer();
& & & & byte[] inputBytes = new byte[1024];
& & & & while (true) {
& & & & & & int count = bufferedInputStream.read(inputBytes);
& & & & & & if (count &= 0) {
& & & & & & & &
& & & & & & }
& & & & & & resultBuffer.append(new String(Arrays.copyOf(inputBytes, count), Util.UTF_8));
& & & & final String parameter = URLDecoder.decode(resultBuffer.toString(),
& & & & & & & & Util.UTF_8.name());
& & & & bufferedInputStream.close();
& & } catch (IOException e) {
& & & & e.printStackTrace();
& & } catch (Exception e) {
& & & & e.printStackTrace();
3.&&&RxJava中使用call.execute()
&&&&&&&& call.execute()是阻塞式返回数据方式,可以和RxJava配合使用;关于RxJava使用参看“RxJava使用”部分。
final String url = &.cn/data/sk/.html&;
final okhttp3.Request request = new okhttp3.Request.Builder()
& & & & .url(url)
& & & & .build();
rx.Observable.create(new Observable.OnSubscribe&String&() {
& & @Override
& & public void call(Subscriber&? super String& subscriber) {
& & & & try {
& & & & & & //处理请求在IO线程中进行
& & & & & & final Response response = mOkHttpClient.newCall(request).execute();
& & & & & & subscriber.onNext(response.body().string());
& & & & catch (IOException e) {
& & & & & & e.printStackTrace();
& & & & & & subscriber.onError(e);
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber&String&() {
& & @Override
& & public void onCompleted() {
& & @Override
& & public void onError(Throwable e) {
& & & & showInfo(e.toString());
& & @Override
& & public void onNext(String s) {
& & & & //处理返回结果,在UI线程中,可以直接显示结果
& & & & showInfo(s);
& & ① &可以通过使用RxJava的map及flatMap过程,直接将json结果转换为具体的数据bean信息(下面以获取天气信息为例,Weatherinfo为自定义的天气信息bean类);具体map及flatMap使用参考部分。
& & ② &该部分需要依赖GSON包。
final String url = &.cn/data/sk/.html&;
rx.Observable.just(url)
& & & & .map(new Func1&String, WeatherinfoResult&() {
& & & & & & @Override
& & & & & & public WeatherinfoResult call(String s) {
& & & & & & & & final okhttp3.Request request = new okhttp3.Request.Builder()
& & & & & & & & & & & & .url(s)
& & & & & & & & & & & & .build();
& & & & & & & & try {
& & & & & & & & & & final Response response = mOkHttpClient.newCall(request).execute();
& & & & & & & & & & //将获取的天气json数据,转换为WeatherinfoResult
& & & & & & & & & & return JsonUtil.parseData(response.body().string(), WeatherinfoResult.class);
& & & & & & & & }
& & & & & & & & catch (IOException e) {
& & & & & & & & & & e.printStackTrace();
& & & & & & & & }
& & & & & & & &
& & & & & & }
& & & & })
& & & & .flatMap(new Func1&WeatherinfoResult, Observable&Weatherinfo&&() {
& & & & & & @Override
& & & & & & public Observable&Weatherinfo& call(WeatherinfoResult weatherinfoResult) {
& & & & & & & & return Observable.just(weatherinfoResult.getWeatherinfo());
& & & & & & }
& & & & })
& & & & .subscribeOn(Schedulers.io())
& & & & .observeOn(AndroidSchedulers.mainThread())
& & & & .subscribe(new Subscriber&Weatherinfo&() {
& & & & & & @Override
& & & & & & public void onCompleted() {
& & & & & & }
& & & & & & @Override
& & & & & & public void onError(Throwable e) {
& & & & & & & & showInfo(&error:& + e.toString());
& & & & & & }
& & & & & & @Override
& & & & & & public void onNext(Weatherinfo s) {
& & & & & & & & showInfo(s.toString());
& & & & & & }
& & & & }) ;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:110451次
积分:1664
积分:1664
排名:千里之外
原创:65篇
评论:31条
(4)(3)(3)(3)(3)(4)(4)(2)(9)(5)(5)(5)(5)(6)(10)Okhttp的高效使用方式
OkHttp 是一个很重要的开源库。它的默认配置已经提供了很好的效果,我们还是采取了一些措施提高 OkHttp 的可用性和自我检查能力:
1. 在文件中开启响应缓存
有些响应消息通过包含Cache-Control HTTP首部字段允许缓存,但是默认情况下,OkHttp 并不会缓存这些响应消息。因此你的客户端可能会因为不断请求相同的资源而浪费时间和带宽,而不是简单地读取一下首次响应消息的缓存副本。
为了在文件系统中开启响应缓存,需要配置一个 com.squareup.okhttp.Cache 实例,然后把它传递 给 OkHttpClient 实例的 setCache 方法。你必须用一个表示目录的 File 对象和最大字节数来实例化 Cache 对象。那些 能够缓存的响应消息会被写在指定的目录中。如果已缓存的响应消息导致目录内容超过了指定的大小,响应消息会按照最近最少使用( LRU Policy )的策略被移除。
正如 Jesse Wilson 所建议的 ,我们将响应消息缓存在 context.getCacheDir() 的子文件夹中:
final @Nullable File baseDir = context.getCacheDir();
if (baseDir != null) {
final File cacheDir = new File(baseDir, &HttpResponseCache&);
okHttpClient.setCache(new Cache(cacheDir, 10*));
2. 集成 Stetho
Stetho 是一个 Facebook 出品的超赞的开源库,它可以让你用 Chrome 的功能&& 开发者工具 来检查调试 应用。
Stetho 不仅能够检查应用的 SQLite 和视图层次,还可以检查 OkHttp 的每一条请求和响应消息:
这种自我检查方式(Introspection)有效地确保了服务器返回允许缓存资源的 HTTP 首部时,且核缓存资源存在时,不再发出任何请求。
开启 Stetho,
public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
Stetho.initializeWithDefaults(this);
添加一个 StethoInterceptor 实例到网络拦截器(Network Interceptor)的列表中去:
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor());
new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
应用运行完毕之后,打开 Chrome 然后跳转到 chrome://inspect。设备、应用以及应用标识符信息会被陈列出来。直接点击&inspect&链接就可以打开开发者工具,然后切换到 Network 标签开始监测 OkHttp 发出的请求。
3. 使用 Picasso 和 Retrofit
可能和我们一样,你使用 Picasso 来加载网络图片,或者使用 Retrofit 来简化网络请求和解析响应消息。在默认情况下,如果你没有显式地指定一个 OkHttpClient,这些开源库会隐式地创建它们自己 的 OkHttpClient 实例以供内部使用。以下代码来自于 Picasso 2.5.2 版本的OkHttpDownloader 类:
private static OkHttpClient defaultOkHttpClient() {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
Retrofit 也有类似的工厂方法用来创建它自己的 OkHttpClient,在OkClient类中。
图片是应用中需要加载的最大的资源之一。Picasso 是严格地按照 LRU 策略在内存中维护它的图片缓存。如果客户端尝试用 Picasso 加载一张图片,并且 Picasso 没有在内存缓存中找到该图片,那么它会委托内部的 OkHttpClient 实例来加载该图片。在默认情况下,由于前面的 defaultOkHttpClient 方法没有在文件系统中配置响应缓存,该实例会一直从服务器加载图片。
自定义一个 OkHttpClient 实例,将从文件系统返回一个已缓存的响应消息这种情况考虑在内。没有一张图片直接从服务器加载。这在应用第一次加载时是尤为重要的。在这个时候,Picasso 的内存中的缓存是 &冷& 的,它会频繁地委托 OkHttpClient 实例去加载图片。
这就需要构建一个用你的 OkHttpClient 配置的 Picasso 实例。如果你在代码中使用 Picasso.with(context).load(...) 来加载图片,你所使用的 Picasso 单例对象,是在with 方法中用自己 的 OkHttpClient 延迟加载和配置的。因此我们必须在第一次调用 with方法之前指定自己的 Picasso 实例作为单例对象。
简单地把 OkHttpClient 实例包装到一个 OkHttpDownloader 对象中,然后传递给Picasso.Builder 实例的 downloader 方法:
final Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttpDownloader(okHttpClient))
//客户端应该在任何需要的时候来创建这个实例
//以防万一,替换掉那个单例对象
Picasso.setSingletonInstance(picasso);
在 Retrofit 1.9.x 中,通过 RestAdapter 使用你的 OkHttpClient 实例,把 OkHttpClient实例包装到一个 OkClient 实例 中,然后传递给 RestAdapter.Builder 实例的 setClient方法:
restAdapterBuilder.setClient(new OkClient(httpClient));
在 Retrofit 2.0 中,直接把 OkHttpClient 实例传递给 Retrofit.Builder 实例的 client即可。
4. 设置用户代理拦截器(User-Agent Interceptor)
当客户端在每一次请求中都提供一个详细的 User-Agent 头部信息时,日志文件和分析数据提供了很有用的信息。默认情况下,OkHttp 的 User-Agent 值仅仅只有它的版本号。要设定你自己的 User-Agent,创建一个拦截器(Interceptor)然后替换掉默认值,参考 StackOverflow 上的建议 :
public final class UserAgentInterceptor implements Interceptor {
private static final String USER_AGENT_HEADER_NAME = &User-Agent&;
private final String userAgentHeaderV
public UserAgentInterceptor(String userAgentHeaderValue) {
this.userAgentHeaderValue = Preconditions.checkNotNull(userAgentHeaderValue);
public Response intercept(Chain chain) throws IOException {
final Request originalRequest = chain.request();
final Request requestWithUserAgent = originalRequest.newBuilder()
.removeHeader(USER_AGENT_HEADER_NAME)
.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
return chain.proceed(requestWithUserAgent);
使用任何你觉得有价值的信息,来创建 User-Agent。
如果你的应用中用到了 WebView,你可以配置使用相同的 User-Agent 值,即之前创建的 UserAgentInterceptor:
WebSettings settings = webView.getSettings();
settings.setUserAgentString(userAgentHeaderValue);
5. 指定合理的超时
在 2.5.0 版本之前,OkHttp 请求默认永不超时。从 2.5.0 版本开始,如果建立了一个连接,或从连接读取下一个字节,或者向连接写入下一个字节,用时超过了10秒,请求就会超时。分别调 用 setConnectTimeout,setReadTimeout 或 setWriteTimeout 方法可以重写那些默认值。
Picasso 和 Retrofit 为它们的默认 OkHttpClient 实例指定不同的超时时长。 默认情况下, Picasso 设定如下:
- 连接超时15秒
- 读取超时20秒
- 写入超时20秒
Retrofit 设定如下:
- 连接超时15秒
- 读取超时20秒
- 写入无超时
用你自己的 OkHttpClient 实例配置好 Picasso 和 Retrofit 之后,就能确保所有请求超时的一致性了。Okhttp的高效使用方式
日期: 18:05:39
来源:ITeye
Okhttp的高效使用方式
OkHttp 是一个很重要的开源库。它的默认配置已经提供了很好的效果,我们还是采取了一些措施提高 OkHttp 的可用性和自我检查能力:
1. 在文件系统中开启响应缓存
有些响应消息通过包含Cache-Control HTTP首部字段允许缓存,但是默认情况下,OkHttp 并不会缓存这些响应消息。因此你的客户端可能会因为不断请求相同的资源而浪费时间和带宽,而不是简单地读取一下首次响应消息的缓存副本。
为了在文件系统中开启响应缓存,需要配置一个 com.squareup.okhttp.Cache 实例,然后把它传递 给 OkHttpClient 实例的 setCache 方法。你必须用一个表示目录的 File 对象和最大字节数来实例化 Cache 对象。那些 能够缓存的响应消息会被写在指定的目录中。如果已缓存的响应消息导致目录内容超过了指定的大小,响应消息会按照最近最少使用( LRU Policy )的策略被移除。
正如 Jesse Wilson 所建议的 ,我们将响应消息缓存在 context.getCacheDir() 的子文件夹中:
final @Nullable File baseDir = context.getCacheDir();
if (baseDir != null) {
final File cacheDir = new File(baseDir, "HttpResponseCache");
okHttpClient.setCache(new Cache(cacheDir, 10*));
2. 集成 Stetho
Stetho 是一个 Facebook 出品的超赞的开源库,它可以让你用 Chrome 的功能—— 开发者工具 来检查调试Android 应用。
Stetho 不仅能够检查应用的 SQLite 数据库和视图层次,还可以检查 OkHttp 的每一条请求和响应消息:
这种自我检查方式(Introspection)有效地确保了服务器返回允许缓存资源的 HTTP 首部时,且核缓存资源存在时,不再发出任何请求。
开启 Stetho,
public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
Stetho.initializeWithDefaults(this);
添加一个 StethoInterceptor 实例到网络拦截器(Network Interceptor)的列表中去:
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor());
new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
应用运行完毕之后,打开 Chrome 然后跳转到 chrome://inspect。设备、应用以及应用标识符信息会被陈列出来。直接点击“inspect”链接就可以打开开发者工具,然后切换到 Network 标签开始监测 OkHttp 发出的请求。
3. 使用 Picasso 和 Retrofit
可能和我们一样,你使用 Picasso 来加载网络图片,或者使用
Retrofit 来简化网络请求和解析响应消息。在默认情况下,如果你没有显式地指定一个 OkHttpClient,这些开源库会隐式地创建它们自己 的 OkHttpClient 实例以供内部使用。以下代码来自于 Picasso 2.5.2 版本的OkHttpDownloader 类:
private static OkHttpClient defaultOkHttpClient() {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
Retrofit 也有类似的工厂方法用来创建它自己的 OkHttpClient,在OkClient类中。
图片是应用中需要加载的最大的资源之一。Picasso 是严格地按照 LRU 策略在内存中维护它的图片缓存。如果客户端尝试用 Picasso 加载一张图片,并且 Picasso 没有在内存缓存中找到该图片,那么它会委托内部的 OkHttpClient 实例来加载该图片。在默认情况下,由于前面的 defaultOkHttpClient 方法没有在文件系统中配置响应缓存,该实例会一直从服务器加载图片。
自定义一个 OkHttpClient 实例,将从文件系统返回一个已缓存的响应消息这种情况考虑在内。没有一张图片直接从服务器加载。这在应用第一次加载时是尤为重要的。在这个时候,Picasso 的内存中的缓存是 “冷” 的,它会频繁地委托 OkHttpClient 实例去加载图片。
这就需要构建一个用你的 OkHttpClient 配置的 Picasso 实例。如果你在代码中使用 Picasso.with(context).load(...) 来加载图片,你所使用的 Picasso 单例对象,是在with 方法中用自己 的 OkHttpClient 延迟加载和配置的。因此我们必须在第一次调用 with方法之前指定自己的 Picasso 实例作为单例对象。
简单地把 OkHttpClient 实例包装到一个 OkHttpDownloader 对象中,然后传递给Picasso.Builder 实例的 downloader 方法:
final Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttpDownloader(okHttpClient))
//客户端应该在任何需要的时候来创建这个实例
//以防万一,替换掉那个单例对象
Picasso.setSingletonInstance(picasso);
在 Retrofit 1.9.x 中,通过 RestAdapter 使用你的 OkHttpClient 实例,把 OkHttpClient实例包装到一个 OkClient 实例 中,然后传递给 RestAdapter.Builder 实例的 setClient方法:
restAdapterBuilder.setClient(new OkClient(httpClient));
在 Retrofit 2.0 中,直接把 OkHttpClient 实例传递给 Retrofit.Builder 实例的 client即可。
4. 设置用户代理拦截器(User-Agent Interceptor)
当客户端在每一次请求中都提供一个详细的 User-Agent 头部信息时,日志文件和分析数据提供了很有用的信息。默认情况下,OkHttp 的 User-Agent 值仅仅只有它的版本号。要设定你自己的 User-Agent,创建一个拦截器(Interceptor)然后替换掉默认值,参考 StackOverflow 上的建议 :
public final class UserAgentInterceptor implements Interceptor {
private static final String USER_AGENT_HEADER_NAME = "User-Agent";
private final String userAgentHeaderV
public UserAgentInterceptor(String userAgentHeaderValue) {
this.userAgentHeaderValue = Preconditions.checkNotNull(userAgentHeaderValue);
public Response intercept(Chain chain) throws IOException {
final Request originalRequest = chain.request();
final Request requestWithUserAgent = originalRequest.newBuilder()
.removeHeader(USER_AGENT_HEADER_NAME)
.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
return chain.proceed(requestWithUserAgent);
使用任何你觉得有价值的信息,来创建 User-Agent。
如果你的应用中用到了 WebView,你可以配置使用相同的 User-Agent 值,即之前创建的 UserAgentInterceptor:
WebSettings settings = webView.getSettings();
settings.setUserAgentString(userAgentHeaderValue);
5. 指定合理的超时
在 2.5.0 版本之前,OkHttp 请求默认永不超时。从 2.5.0 版本开始,如果建立了一个连接,或从连接读取下一个字节,或者向连接写入下一个字节,用时超过了10秒,请求就会超时。分别调 用 setConnectTimeout,setReadTimeout 或 setWriteTimeout 方法可以重写那些默认值。
Picasso 和 Retrofit 为它们的默认 OkHttpClient 实例指定不同的超时时长。 默认情况下, Picasso 设定如下:
- 连接超时15秒
- 读取超时20秒
- 写入超时20秒
Retrofit 设定如下:
- 连接超时15秒
- 读取超时20秒
- 写入无超时
用你自己的 OkHttpClient 实例配置好 Picasso 和 Retrofit 之后,就能确保所有请求超时的一致性了。
扫码关注公众账号,分享更多资料。
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。 1-n的全排列中,逆序数最小为0(正序),最大为n*(n-1) / 2(倒序) 给出2个数n和k,求1-n的全排列中,逆序数为k的排列有多少种? 例如:n = 4 k = 3。
1 base64 1.1 简介 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。例:将对ABC进行BASE64编码首先
ADB WIFI这款插件可以免去我们频繁的插拔USB数据线的动作,通过绑定手机的无线IP,在AndroidStudio端可以直接运行Module到手机上,可以很方便的进行app调试和抓包. 第一步,在Android Studio中下载ADB WIFI插件. (通过File–Settings,或者Ctrl+Alt+S呼出设置界面,选择Plugins–Browse repositories..) 第二步,下载完毕后,根据系统提示,restart AndroidStudio. 第三步,用USB数据线连接手机和电
慎用向右滑动操作、慎用横屏展示效果、按钮原理页面底部、使用SVG格式做矢量图…… 以上提到的技巧全都出自今天这篇好文,简单小巧但实操性很强,作为设计师,也要尽量避开这些坑。 1、交互上,慎用向右滑动的操作方式。 如:刮刮乐涂抹效果,左右滑动翻页等。原因:苹果手机上,向右滑动容易触发返回“上一级页面”效果。 2、交互上,慎用横屏展示效果。 原因:体验上,需要用户设备开启屏幕旋转功能,才能正常观看,用户操作成本高。对不同屏幕的手机,长宽比例不一,难以展示最佳的视觉效果。 3、视觉上,功能按钮等,远离页面底部(
Welcome to Unity. 欢迎使用Unity。 Unity is made to empower users to create the best interactive entertainment or multimedia experience that they can. This manual is designed to help you learn how to use Unity, from basic to advanced techniques. It can be read
SQLite 是用C语言编写的开源嵌入式数据库引擎。支持太多数的SQL92biaozhun,并且 可以再所有主要的操作系统上运行。 支持高达2TB大小的数据库 以单个文件的形式存在 以B-Tree的数据结构形式存储在磁盘里 特点: 轻量级 一个动态库、单文件 独立性 没有依赖、无需安装 隔离性 全部在一个文件夹中 跨平台 支持众多操作系统 多语言接口 支持众多编程语言 安全性 事务 事务处理的安全性问题: 通过数据库上的独占性和共享锁实现独立事务处理 多个进程可以再同一时间从同一数据库读取数据,但是只能有
ContentProvider作为专门为不同的应用之间进行数据共享的组件。IPC简直就是它的专业。 1,ContentProvider可以用来做什么 ContentProvider提供了访问本地应用程序的数据库的办法,它对外提供了几个接口,让想获得这些数据的其他应用程序去实现。 而如果没有ContentProvider,试想下怎么获取这些数据,不同的应用处于不同的进程,我们自己去操作的话,往往会很复杂。而android系统很贴心,为我们提供了ContentProvider。 获取什么数据呢。比如:手机里视
介绍 android官方文档: AlarmManager 在Android平台,除了使用AlarmManger外,还可以使用Timer或者Handler来实现定时任务,但这两种方式定时并不会太准确;因此如果我们需要实现精准定时任务,使用AlarmManger更为合理。 AlarmManager类提供对系统闹钟服务(或称为定时器服务)的访问接口,使用它既可以指定单次执行的定时任务,也可以指定重复运行的任务。 当闹钟指定触发时间到达时,实际上是系统发出为这个闹钟注册的广播,因此我们需要实现一个针对特定闹钟事件
目标效果:
程序运行,显示一输入框和按钮,在输入框输入内容点击按钮会提示保存成功,关闭程序,再次打开会在输入框显示刚才输入的内容,并提示英文。 1.activity_main.xml页面放置两个控件。 activity_main.xml页面: RelativeLayout xmlns:android="/apk/res/android" xmlns:tools="/tools" android:
Windows下虚拟机安装Mac OS X —– VM12安装Mac OS X 10.11 随着Iphone在国内大行其道,越来越多的开发者涌入IOS开发大军 中,但都苦于没有苹果机,本文即将介绍WIN虚拟MAC的教程。 一、工具: Mac OS X 10.11 镜像文件下载 提取密码是dqbi unlocker208文件下载地址 提取密码是b2ac VM可自行百度下载,本文中用的是VM12 二、基本步骤 1.首先下载 vmware workstation,以管理员身份运行,安装点击下一步即可。注册码百度
Copyright (C)
ITfish.net}

我要回帖

更多关于 okhttp使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信