IT虾米网

Android OkHttp(1)详解

admin 2018年06月01日 手机开发 136 0
OkHttp是一个流行的第三方开源网络请求框架,在目前的一些APP开发中比较流行。Android平台开源的网络请求框架不少,比如常见的Volley, AsyncHttpClient等等。

一些开发者逐渐的不再使用原先旧的AsyncHttpClient,原因很多,比如AsyncHttpClient底层的实现使用了Android旧的网路请求API,而在新版的SDK中,这些API不再被支持。同时AsyncHttpClient不支持缓存,而像Volley则支持缓存。等等各方面的对比使得OkHttp突显出来更多的优势。
OkHttp在github上的项目主页是:https://github.com/square/okhttp
我写一个简单的例子说明OkHttp的使用。
这个例子很简单,在一个布局中放一个ImageView,然后使用OkHttp对我csdn的博客头像地址发起请求,请求得到的byte组装成Bitmap,然后设置到ImageView显示出来。
布局文件很简单,就一个ImageView。从略。
Java代码:

package zhangphil.demo; 
 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ImageView; 
 
import java.io.IOException; 
 
import okhttp3.Call; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 
import okhttp3.Callback; 
 
 
public class MainActivity extends AppCompatActivity { 
 
    private final String image_url = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg"; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
 
        //在布局里面放一个ImageView,放网络请求后的图片 
        final ImageView image = (ImageView) findViewById(R.id.imageView); 
 
        //初始化OkHttpClient 
        final OkHttpClient client = new OkHttpClient(); 
 
        //创建OkHttpClient针对某个url的数据请求 
        Request request = new Request.Builder().url(image_url).build(); 
 
        Call call = client.newCall(request); 
 
        //请求加入队列 
        call.enqueue(new Callback() { 
            @Override 
            public void onFailure(Call call, IOException e) { 
                //此处处理请求失败的业务逻辑 
            } 
 
            @Override 
            public void onResponse(Call call, Response response) throws IOException { 
                //我写的这个例子是请求一个图片 
                //response的body是图片的byte字节 
                byte[] bytes = response.body().bytes(); 
                //response.body().close(); 
 
                //把byte字节组装成图片 
                final Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
 
                //回调是运行在非ui主线程, 
                //数据请求成功后,在主线程中更新 
                runOnUiThread(new Runnable() { 
                    @Override 
                    public void run() { 
                        //网络图片请求成功,更新到主线程的ImageView 
                        image.setImageBitmap(bmp); 
                    } 
                }); 
            } 
        }); 
    } 
}



本例使用OkHttp从一个URL下载图片数据然后装配成Bitmap设置到ImageView里面,其实如果仅仅是从一个URL加载图片,则可以考虑使用Glide(见附录文章2),Glide内部使用了缓存,不像本例的OkHttp那样,没有使用缓存,Glide使用缓存,如果一个URL下载的图片成功,再次请求就从缓存中读取而不是重复浪费计算资源再次请求图片。


附录文章:
1,《Android第三方异步网路加载库AsyncHttpClient内部实现缓存策略了吗?》链接地址:http://blog.csdn.net/zhangphil/article/details/48595817
2,《Android图片加载与缓存开源框架:Android Glide》链接:http://blog.csdn.net/zhangphil/article/details/45535693


发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

通过定时任务自动清理长时间挂着没commit的事物详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。