之前学习安卓的时候一直使用xutils进行网络请求和图片加载,很是强大,后来换了okhttp,但是它的封装性略低,请求个网络代码一大堆,所以就进行简单的封装,新手可以学习一下回调的使用
代码
public class MyHttpUtil {
private static OkHttpClient mOkHttpClient;
public static void doGet(String url, final MyHttpResult httpResult){
if(mOkHttpClient==null){
mOkHttpClient=new OkHttpClient();
}
Request.Builder requestBuilder = new Request.Builder().url(url);//在此处添加url
//可以省略,默认是GET请求
requestBuilder.method("GET",null);
Request request = requestBuilder.build();
Call mcall= mOkHttpClient.newCall(request);
mcall.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
ThreadUtils.runOnMainThread(new Runnable() {
@Override
public void run() {
if(httpResult!=null){
httpResult.onFailure(e);
}
}
});
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String result = response.body().string();
ThreadUtils.runOnMainThread(new Runnable() {
@Override
public void run() {
if(httpResult!=null){
httpResult.onResponse(result);
}
}
});
}
});
}
public interface MyHttpResult{
public void onFailure(IOException e);
public void onResponse(String response);
}
}
总结
只封装了异步get请求,其他方式的请求也类似吧,其中okhttp原本的callback是在子线程中进行的,所以就无法在其中更新界面了,在这里我在主线程中采用回调,这样就可以直接在callback中更新界面了^_^
其中运行在子线程中的方法用到了另一个自定义工具类,代码如下
public class ThreadUtils {
//使用主线程的looper创建handler 这个handler一定执行在主线程的
private static Handler handler = new Handler(Looper.getMainLooper());
private static Executor executor = Executors.newSingleThreadExecutor();
/**
* 在子线程中执行代码
* @param r
*/
public static void runOnNonUIThread(final Runnable r){
new Thread(){
@Override
public void run() {
r.run();
}
}.start();
}
/**
* 在主线程中执行代码
* @param r
*/
public static void runOnMainThread(Runnable r){
handler.post(r);
}
}
注释写的很清楚了,
使用例子
MyHttpUtil.doGet("http://www.baidu.com", new MyHttpUtil.MyHttpResult() {
@Override
public void onFailure(IOException e) {
}
@Override
public void onResponse(String response) {
System.out.println("result"+response);
// Log.i("result",response.body().string().toString());
}
});