文章标题
来源:互联网 发布:音质好的软件 编辑:程序博客网 时间:2024/06/04 19:20
okhttp二次封装 瞎写哈哈哈
打算换个网络框架,网上搜索了一圈发现okHttp还是不错的,不过网络请求实际上不是一个 异步的,不明白为什么有回调了却不做成异步的方式,所以自己对okhttp进行了个二次封装,能用就行。
先屡屡思路,先要有一个父类来处理网络请求,父类实现一个网络请求接口,并重写抽象方法,然后子类继承父类,调用父类重写的抽象发放然后发送请求,还需要做一个回调,把请求来的数据发送到activity,然后要实现异步就要在父类的回调里用一下handler,在大致就是这么个套路。
先在android studio中 添加okhttp的依赖
compile 'com.squareup.okhttp:okhttp:2.6.0'
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.squareup.okhttp:okhttp:2.6.0' compile 'de.greenrobot:greendao:1.3.7' testCompile 'junit:junit:4.12' compile 'com.google.code.gson:gson:2.2.4'}
然后写个回调需要用的接口,一个成功的回调和一个失败的回调
public interface OkHttpCallBack { void onFailure(Request request, String e); void onResponse(JSONObject response) throws IOException;}
然后自己在定义一个接口,里面分别是get请求和post请求的抽象方法。接口里好像都是抽象方法哈哈哈
public interface OkHttpInterface { /** * 发送 http get 请求 * * @param url * @param params * @param httpRequestListener */ void sendHttpGet(Activity activity, String url, Map<String, String> params, final OkHttpCallBack okHttpCallBack); /** * 发送 http post 请求 * * @param url * @param params * @param bodyParams * @param httpRequestListener */ void sendHttPost(Activity activity, String url, Map<String, String> params, Map<String, String> bodyParams, OkHttpCallBack okHttpCallBack);}
然後就可以写父类了,实现请求的接口,重写get和post方法
在对应的方法里 调用 okhttp的get和post方法就好了,最后会有一个 回调,我们只需要在这个回调里用一下handler.post来实现异步就可以了,最后我们用自己的写的回调接口把数据传到activity就可以了。
public class OkHttpService implements OkHttpInterface { private OkHttpClient okHttpClient = new OkHttpClient(); private Handler handler = new Handler(); @Override public void sendHttpGet(final Activity activity, String url, Map<String, String> params, final OkHttpCallBack okHttpCallBack) { okHttpClient = new OkHttpClient(); Request.Builder builder = new Request.Builder(); final Request request = builder.get().url(url).build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(final Request request, final IOException e) { } @Override public void onResponse(final Response response) throws IOException { sendSuccessResultCallback(response, okHttpCallBack); } }); } @Override public void sendHttPost(Activity activity, String url, Map<String, String> params, Map<String, String> bodyParams, final OkHttpCallBack httpRequestListener) { FormEncodingBuilder formEncodingBuilder = new FormEncodingBuilder(); Set entries = params.entrySet(); if (entries != null) { Iterator iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); Object key = entry.getKey(); Object value = entry.getValue(); formEncodingBuilder.add(key.toString(), value.toString()); } RequestBody body = formEncodingBuilder.build(); Request request = new Request.Builder().url(url).post(body).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { sendFailedStringCallback(request, e.getMessage(), httpRequestListener); } @Override public void onResponse(Response response) throws IOException { sendSuccessResultCallback(response, httpRequestListener); } }); } } private void sendSuccessResultCallback(final Response response, final OkHttpCallBack okHttpInterface) throws IOException { final String str = response.body().string(); handler.post(new Runnable() { @Override public void run() { try { okHttpInterface.onResponse(new JSONObject(str)); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } }); } private void sendFailedStringCallback(final Request response, final String e, final OkHttpCallBack okHttpInterface) { handler.post(new Runnable() { @Override public void run() { okHttpInterface.onFailure(response, e); } }); }}
接下来就可以写我们的子类了,子类需要做的工作很简单 继承父类 然后写需要的请求方法,并且把参数传到父类里面执行
public class HomeService extends OkHttpService { public void get(Activity activity, String url, String str, final OkHttpCallBack callback) { sendHttpGet(activity, url, null, new OkHttpCallBack() { @Override public void onFailure(Request request, String e) { callback.onFailure(request, e); } @Override public void onResponse(JSONObject response) throws IOException { callback.onResponse(response); } }); } public void login(final Activity activity, String username, String password, final OkHttpCallBack callback) { String paramsStr = HTTPURLConfig.HEARD_URL + HTTPURLConfig.LOGIN; Map<String, String> paramsMap = new HashMap<>(); paramsMap.put("client_id", HTTPURLConfig.CLIENT_ID); paramsMap.put("client_secret", HTTPURLConfig.CLIENT_SECRET); paramsMap.put("grant_type", HTTPURLConfig.GRANT_TYPE); paramsMap.put("username", username); paramsMap.put("password", password); sendHttPost(activity, paramsStr, paramsMap, null, new OkHttpCallBack() { @Override public void onFailure(Request request, String e) { callback.onFailure(request, e); } @Override public void onResponse(JSONObject response) throws IOException { saveToken(activity, response); callback.onResponse(response); } }); } private void saveToken(Activity activity, JSONObject response) { try { AccessTokenVO AccessTokenVO = new AccessTokenVO(null, response.getString("access_token")); DBManager.getInstance(activity).insert(AccessTokenVO); RefreshTokenVO refreshTokenVO = new RefreshTokenVO(null, response.getString("refreshTokenVO")); DBManager.getInstance(activity).insert(refreshTokenVO); } catch (JSONException e) { e.printStackTrace(); } }}
然后我们的activity就可以创建 子类的对象 然后调用 请求方法 传入参数 ,就得到接口返回的数据了
@Override public void onClick(View view) { switch (view.getId()) { case R.id.login_btn: HomeService homeService = new HomeService(); homeService.login(LoginActivity.this, userName.getText().toString(), password.getText().toString(), new OkHttpCallBack() { @Override public void onFailure(Request request, String e) { Toast.makeText(LoginActivity.this, "失败 ", Toast.LENGTH_SHORT).show(); } @Override public void onResponse(JSONObject response) throws IOException { startActivity(new Intent(LoginActivity.this, HomeActivity.class)); } }); break; } }
自己尝试着封装的,最后接口是通了,不知道自己上面说的对不对,有错的地方欢迎指出。
阅读全文
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- android 7.1 android device monitor file显示空白
- TestLink-1.9.16邮箱配置(网易163)
- LSTM(Long-Short Term Memory)与GRU(Gated Recurrent Unit )
- 虚拟机中的windows 系统按下字母键会打出数字
- Sql server的游标使用
- 文章标题
- Spring MVC第一节课 环境搭建
- Machine Learning on Spark——统计基础(二)
- G128的RTI时间设置
- php编程规范
- C语言读取文本文件字符串内容不对,可能是文本编码问题
- QBC检索方式
- Android 开发总结分享(一)挖坑与填坑
- SQL查询方式