获取client
在okhttp官方说明中建议只使用一个全局OkHttpClient对象。所以我们这样创建一个OkHttpClient对象:
final static OkHttpClient client = new OkHttpClient();
这个okhttp client会获取你的请求,发送它给服务器,然后返回服务器的响应给你。
创建缓存
使用缓存是可选的,但如果你想让你的app网络连接更快(同时也会减少带宽的使用)是非常需要它的。这个小的额外的代码是非常值得的。
下面是我们如何创建缓存:
File cacheDirectory = new File(this.getCacheDir(),"http");
int cacheSize = 10*1024*1024;
try{
Cache cache = new Cache(cacheDirectory,cacheSize);
client.setCache(cache);
}catch(IOException e){
e.printStackTrace()
}
我们创建一个缓存目录cacheDirectory通过创建一个新的文件对象。我们传进文件对象两个参数:
getCacheDir返回我们的缓冲目录
缓存文件的名字
构建请求(request)
使用okhttp的Request.Builder 类创建你的http请求:
Request request = new Request.Builder().url(fileUrl).build();
我们建立了一个简单的http请求,像url()传入一个我们想下载文件的url地址。
调用build() 方法创建请求。
一旦你创建好请求,你可以调用execute()方法立刻执行。它会在主线程运行,所以你最好在多线程中使用。
异步(Queue)请求
我们想要在一个工作线程执行http请求,可以使用OkHttp的Call 类的enqueue() 方法:
Client.newCall(request).enqueue(new Callback(){
@Override
public void onFailure(Request request,IOException e){....}
@Override
public void onResponse(Request request) throws IOException{....}
});
enqueue() 将请求放入任务计划表并在未来的某时执行。通常它会立马运行除非在队列(queue)里有其它请求。
有两个需要的方法,其中一个是回调后执行:
onFailure(),请求执行时失败,由于连接问题、超时或取消。
onResponse(),http请求成功检索和服务器返回一个响应。注意的是即使收到响应,也不意味着你的请求就成功了,举个例子,有时服务器可能会返回404响应代码,你必须处理它当提取来自响应的信息。
请求失败时会发生什么?
onFailure() 在连接出问题时被调用
记住请求和回复都是在工作线程中执行的。所以你不能用结果直接更新主线程UI。
我们使用runable 更新ImageView去显示失败的图片。我们也设置isRequestProblem 布尔值为真(我们将会在Activity的生命周期方法中用到它,onResume(),来展示正确的图片当设备的方向改变)。
请求成功时会发生什么
收到响应并不意味着请求成功。它只意味着服务器接收到你的请求然后发出响应。是你来决定响应是否成功。我们使用Response 类的isSuccessful()方法来评估响应是否成功。如果不成功然后我们抛出一个异常。
如果我们获得响应代码是200(这是下载成功常数),然后我们会从响应体中取得一个输入流。这里举个常见情景,假设此时我们请求是下载一张图片,我们的情况可以是这样:使用BitmapFactory类的decodeStream() 方法来把图片转换为bitmap.这个bitmap后面会传进我们的updateImage()方法:
if(response.code()==SUCCESSFUL_DOWNLOAD){
isRequestProblem = false;
isResponseProblem = false;
ResponseBody in = response.body();
InputStream inputStream = in.byteStream();
updateImage(BitmapFactory.decodeStream(inputStream));
}
ps:可以上网了解下所有可能的响应状态码。
如果状态码不是200,我们用一个runnable 来展示错失的图片。