OKhttp的封装(下)
OKhttpManager2.Class 请求工具类
package com.example.administrator.okhttp3; import android.os.Handler;
import android.os.Looper; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response; /**
* 当前类: OKhttp 工具封装类
* <p/>
* Created by ${火龙裸先生} on 2016/9/30.
* 邮箱:791335000@qq.com
*/
public class OkhttpManager2 { private OkHttpClient client;
private static OkhttpManager2 okhttpManager2;
private Handler mHandler; /**
* 单例模式 OKhttpManager2实例
*/
private static OkhttpManager2 getInstance() {
if (okhttpManager2 == null) {
okhttpManager2 = new OkhttpManager2();
}
return okhttpManager2;
} private OkhttpManager2() {
client = new OkHttpClient();
mHandler = new Handler(Looper.getMainLooper());
} //****************** 内部逻辑处理方法 ******************/
private Response p_getSync(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
return response;
} private String p_getSyncAsString(String url) throws IOException {
return p_getSync(url).body().string();
} private void p_getAsync(String url, final DataCallBack callBack) {
final Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
deliverDataFailure(request, e, callBack);
} @Override
public void onResponse(Call call, Response response) {
try {
String result = response.body().string();
deliverDataSuccess(result, callBack);
} catch (IOException e) {
e.printStackTrace();
deliverDataFailure(request, e, callBack);
}
}
});
} private void p_postAsync(String url, Map<String, String> params, final DataCallBack callBack) {
RequestBody requestBody = null;
if (params == null) {
params = new HashMap<String, String>();
}
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) {
String key = entry.getKey().toString();
String value = null;
if (entry.getValue() == null) {
value = "";
} else {
value = entry.getValue().toString();
}
builder.add(key, value);
}
requestBody = builder.build();
final Request request = new Request.Builder().url(url).post(requestBody).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
deliverDataFailure(request, e, callBack);
} @Override
public void onResponse(Call call, Response response) throws IOException {
try {
String result = response.body().string();
deliverDataSuccess(result, callBack);
} catch (IOException e) {
e.printStackTrace();
deliverDataFailure(request, e, callBack);
}
}
});
} //****************** 数据分发的方法 ******************/
private void deliverDataFailure(final Request request, final IOException e, final DataCallBack callBack) {
mHandler.post(new Runnable() {//发送到主线程
@Override
public void run() {
if (callBack != null) {
callBack.requestFailure(request, e);
}
}
});
} private void deliverDataSuccess(final String result, final DataCallBack callBack) {
mHandler.post(new Runnable() {//同样 发送到主线程
@Override
public void run() {
if (callBack != null) {
callBack.requestSuccess(result);
}
}
});
} //****************** 对外公布的方法 ******************/
public static Response getSync(String url) throws IOException {
return getInstance().p_getSync(url);//同步GET,返回Response类型数据
} public static String getSyncAsString(String url) throws IOException {
return getInstance().p_getSyncAsString(url);//同步GET,返回String类型数据(和上面getSync方法只是返回的数据类型不同而已)
} public static void getAsync(String url, DataCallBack callBack) {
getInstance().p_getAsync(url, callBack);//异步GET 调用方法
} public static void postAsync(String url, Map<String, String> params, DataCallBack callBack) {
getInstance().p_postAsync(url, params, callBack);//POST提交表单 调用方法
} //****************** 数据回调接口 ******************/
public interface DataCallBack {
void requestFailure(Request request, IOException e); void requestSuccess(String result);
}
}
MainActivity.class 工具类的调用方法
package com.example.administrator.okhttp3; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import okhttp3.Request; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button1, button2, button3, button4;
private TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.btn_one);
button2 = (Button) findViewById(R.id.btn_two);
button3 = (Button) findViewById(R.id.btn_three);
button4 = (Button) findViewById(R.id.btn_four);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
textView = (TextView) findViewById(R.id.tv);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_one://同步GET
new Thread(new Runnable() {
@Override
public void run() {
try {
// 调用getSync方法(以下两行),和调用getSyncAsString方法相同,只是返回数据类型不一样
// Response response = OkhttpManager2.getSync("http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9");
// final String message = response.body().string();
// 调用getSyncAsString方法(以下一行)
final String message = OkhttpManager2.getSyncAsString("http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9");
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(message);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
break;
case R.id.btn_two://异步GET
OkhttpManager2.getAsync("http://web.juhe.cn:8080/finance/exchange/rmbquot", new OkhttpManager2.DataCallBack() {
@Override
public void requestFailure(Request request, IOException e) {
//数据加载成功会执行此方法,此时可以直接更新UI
textView.setText(e.toString());
} @Override
public void requestSuccess(String result) {
//数据加载成功会执行此方法,此时可以直接更新UI
textView.setText(result);
}
});
break;
case R.id.btn_three://POST提交表单
Map<String, String> params = new HashMap<String, String>();
params.put("cellphone", "123456");//用户名
params.put("password", "123456");//密码
OkhttpManager2.postAsync("http://58.250.31.19:28080/afeducation/appfront/main/loginUser_app.do", params, new OkhttpManager2.DataCallBack() {
@Override
public void requestFailure(Request request, IOException e) {
//数据加载成功会执行此方法,此时可以直接更新UI
textView.setText(e.toString());
} @Override
public void requestSuccess(String result) {
//数据加载成功会执行此方法,此时可以直接更新UI
textView.setText(result);
}
});
break;
case R.id.btn_four://文件下载 break;
}
}
}
activity_main.xml 布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.okhttp3.MainActivity"> <Button
android:id="@+id/btn_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="同步get" /> <Button
android:id="@+id/btn_two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="异步get" /> <Button
android:id="@+id/btn_three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Post提交表单" /> <Button
android:id="@+id/btn_four"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="文件下载" /> <TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text" />
</LinearLayout>
个人觉得主要得注意的地方是,任何更新UI操作,都必须要在主线程中才能更新,而网络请求操作,则需要放在子线程。这里通过接口回调和数据分发的方式,利用Handler发送到主线程,实现UI的更新。
OKhttp的封装(下)的更多相关文章
- OkHttp 优雅封装 OkHttps 之 回调线程魔变
第一篇:OkHttp 优雅封装 HttpUtils 之 气海雪山初探 第二篇:OkHttp 优雅封装 HttpUtils 之 上传下载解密 简介 HttpUtils 从 v2.3.0 之后便重命名了, ...
- OkHttp 优雅封装 HttpUtils 之 上传下载解密
曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 还没看过第一篇文章的欢迎移步:OkHttp 优雅封装 HttpUtils 之气海雪山初 ...
- PHP.TP框架下商品项目的优化3-php封装下拉框函数
php封装下拉框函数 因为在项目中会经常使用到下拉框,所以根据一个表中的数据制作下拉框函数,以便调用 //使用一个表的数据做下拉框函数 function buildSelect($tableName, ...
- OkHttp 优雅封装 HttpUtils 之 气海雪山初探
曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 介绍 HttpUtils 是近期开源的对 OkHttp 轻量封装的框架,它独创的异步预 ...
- android 开发 - 使用okhttp框架封装的开发框架
概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 ...
- 安卓OKhttp请求封装
目前安卓开发中使用的网络工具为OKhttp,但是okhttp的使用还不是很方便,在okhttp的基础上再对请求进行封装会极大的方便网络调用. 下面直接上代码. 请求封装 public class Ht ...
- OKhttp的封装(上)
自从介绍了OKhttp3的一些基本使用之后,又偷了下懒,所以它的续篇被搁置了一段时间,现在补充. OKhttpManager.Class 请求工具类 package com.example.admi ...
- 基于OkHttp的封装库TigerOkHttp的使用
在前面熟悉了OkHttp的用法之后,为了简化用法同时适用于我的项目,我针对OkHttp进行了更进一步的封装(源码及其Demo地址在https://github.com/huyongli/TigerOk ...
- Okhttp实用封装
概述 对okhttp的get,put,delete,post请求简单封装,减少了不必要的冗余代码 详细 代码下载:http://www.demodashi.com/demo/11101.html 在自 ...
随机推荐
- sqlserver中将某数据库下的所有表字段名称为小写的改为大写
declare @name varchar(50), @newname varchar(50),@colname varchar(50) declare abc cursor for select ( ...
- Linq→join中指定多个条件
还是习惯先撸一段SQL * FROM User_Pic P AND P.Guid = R.UserPicGuid ORDER BY PicSize DESC 然后发现Linq中的join不能多条件.. ...
- 【Hadoop】HDFS的运行原理
博文已转移,请借一步说话http://www.weixuehao.com/archives/596 简介 HDFS(Hadoop Distributed File System )Hadoop分布式文 ...
- Spring配置bean文件的底层实现方式
首先 bean文件如下: <beans> <bean id="date" class="java.util.Date"></bea ...
- 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”
接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...
- Lvs原理及部署之ARP协议
1.什么使ARP协议 ARP协议,全称"Address Resolution Protocol" ,中文名是地址解析协议,使用ARP协议可实现通过IP地址获得对应的物理地址(MAC ...
- Pragma如何分组
Pragma Pragma Mark #pragma mark - 是一个在类内部组织代码并且帮助你分组方法实现的好办法. 我们建议使用 #pragma mark - 来分离: 不同功能组的方法 pr ...
- hiberante学习笔记
1.配置文件(hibernate映射文件): 让hibernate知道该怎么样去load,store持久化对象: 1.1 数据库忌讳的字段名 1) User 2) index 2.数据库表中一对多,多 ...
- php服务端写日志文件
1.需求 在服务端记录日志 2.基础版 最基础的文件读写,(要注意window和linux的换行符,window是\r\n,linux是\n),这里就写入一个时间. <?php $handle ...
- 在c或c+程序里打印调用栈。转
在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如 ...