ANDROID OKHTTP MVP

最近的项目中遇到了需要使用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(){


			@Override
			public 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以上的版本.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值