ANDROID OKHTTP MVP

来源:互联网 发布:手机怎么注册淘宝网店 编辑:程序博客网 时间:2024/05/01 08:48

最近的项目中遇到了需要使用okhttp进行数据交互,同时需要使用mvp架构,在调研这个模块的时候补充了一些自己一知半解的知识,现将它记录下来。


1、同步、异步请求

同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 

异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 


异步请求涉及到多线程问题,android所有的请求必须是异步,主线程不支持网络请求,以使它不被阻塞。这样的话就涉及到了多线程以及稍微高级一些的线程池技术。

在之前的项目开发中发现:部分手机对于某个应用能够开启的最大数有限制(例华为荣耀6),并且线程开的越多就越有oom的风险。


2、okhttp的 get,post方法

get和post区别如下:

(1)get是从服务器上获取数据,post是向服务器传送数据。

(1)   在客户端,Get方式在通过URL提交数据,数据URL可以看到;POST方式,数据放置在HTML HEADER提交。

(2) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

(2)   GET方式提交的数据最多只能有1024字节,而POST没有此限制

(3)   安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。


总结上面的主要几点:get是通过url来传送数据,post是将数据放入到header中:


get和post方式在okhttp中的应用:

get请求:

OkHttpClientManager ocm = OkHttpClientManager.getInstance();Thread thread = new Thread(new Runnable(){@Overridepublic void run() {Request request = new Request.Builder().url("http://121.43.156.50/api/v0/doctor/cc056df9-cf24-464f-bb5e-d2b715b610dc?accessToken=464e34e2-6957-4baf-978f-c908dc2d985b").build();Response response;//response = client.newCall(request).execute();client.newCall(request).enqueue(cb);Log.d("thread info request", Thread.currentThread().getName());}});excutorServiceManager.getExecutor().execute(thread);

处理返回的数据:

Callback cb = new Callback() {  @Override  public void onFailure(Request request, IOException e) {  e.printStackTrace();  Log.e(TAG, "cannot get accesstoken");  }  @Override  public void onResponse(Response response) throws IOException {  if (!response.isSuccessful()) {  throw new IOException("Unexpected code " + response);  }  String rp = response.body().string();  Log.e(TAG, "response: "+rp);  Log.d("thread info callback", Thread.currentThread().getName());  doctor = new Gson().fromJson(rp, DoctorBean.class);  handler.post(new Runnable() {        @Override public void run() {    show();        }      });  }};mDoctorModel.load(cb);

post请求类似,只是需要加上header就可以了。


3、线程、线程池

关于对okhttp线程的说明:

在项目中使用的是mvp和okhttp结合,在android中访问数据时通过异步请求,所以会创建一个thread,但是callback执行的时候也是一个异步请求。但是有不同的是request时的请求时自己创建的,callback是okhttpclientmanager自己创建并维护的。callback的进程个数数量可以不用考虑,但是自己创建的thread性能上有很大的问题。


对于上面的这种情况,引入了可以重用的线程池,

四种线程池中的:newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。


代码如下:

package qingfengmy.mvp.utils;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorServiceManager {private static ExecutorServiceManager mInstance;private ExecutorService executor;private ExecutorServiceManager(){this.executor = Executors.newFixedThreadPool(6);  }public static ExecutorServiceManager getInstance()    {        if (mInstance == null)        {            synchronized (ExecutorServiceManager.class)            {                if (mInstance == null)                {                    mInstance = new ExecutorServiceManager();                }            }        }        return mInstance;    }public ExecutorService getExecutor() {return executor;}public void setExecutor(ExecutorService executor) {this.executor = executor;}}

然后在modelimpl去创建thread,然后把它加入到executorservice中。


代码

http://download.csdn.net/detail/mcdullsin/9214905


ps:okhttp需要jdk 1.7以上的版本.

0 0