最近在做android统计SDK,因为之前参与的网络开发项目都遇到一些相同的问题:
1.大量的并发请求造成堵塞,特别是遇上让人无语的3G网络,无限loading。。。
2.一般来说一个网络请求都会用使用到一个异步线程,大量的线程创建、运行、销毁又造成了系统资源的浪费
3.请求结束得到结果后,如果需要更新UI,一个不小心忘了返回UI线程,各种崩溃。。。
前些日子跟同事商量能不能做个请求队列去进行控制,于是趁着热度没消退说干就干,建了个模型,以备日后使用。
在这个模型中,有高中低三个优先级信道如下:高优先级--1,中优先级--3,低优先级--2
规则:
1.正常情况下各个优先级使用各自信道(线程)
2.高级信道满载、中、低级信道空置,则高级请求可使用低级信道
构思:
UI线程将期望的网络请求url和参数通过一个封装好的Runnable提交给Service处理(当然也可以交给一个Thread处理,本例使用Service),Service接收到请求,判断优先级,加入到相应线程池中排队。线程池启动线程发起网络请求,最后通过监听器将结果返回给Service,Service发送广播通知UI线程,UI线程更新相关界面,结束。
废话说完,上例子:
首先是封装好的Runnable
- public
class HttpConnRunnable implementsRunnable, Parcelable { -
-
public static final int HIGH_LEVEL 0;= -
public static final int NORMAL_LEVEL 1;= -
public static final int LOW_LEVEL 2;= -
-
private int mPriority //优先级,默认为普通= NORMAL_LEVEL; -
private String "";mUrl = -
-
private HttpConnListener //监听器mListener; -
-
-
public HttpConnRunnable() { -
super(); -
} -
-
public HttpConnRunnable( intpriority) { -
super(); -
mPriority = priority; -
} -
-
@Override -
public void run() { -
Log.i(Thread.currentThread().getName(), "----Start to connect:" + ",mUrl + priority:" + "-----");mPriority + -
try { -
Thread.sleep(10000); -
//TODO:进行网络请求相关操作,并通过listener返回结果 -
mListener.onSucceed("Connected to " + "mUrl + succeed!" ); -
} -
catch (InterruptedException e) { -
e.printStackTrace(); -
} -