之前學習安卓的時候一直使用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());
}
});