android 网络访线程池问题!handler looper
来源:互联网 发布:java数据库开发实例 编辑:程序博客网 时间:2024/06/15 09:58
我就是创建了一个线程池,每次网络请求,都要走这个线程池,方便管理维护,然后让handler,发送数据到主线程,但是当线程池的数量达到指定值时
,就没有办法访问,网络数据了(致使我的网络访问框架不能用了)!
原因我也没查,可能就是 looper 或者 handler 占住线程不放了,致使线程在使用后不销毁,很快线程池装满,不再执行网络请求!
解决办法:
如果不用线程池,每次开启一个线程就没事了!
但是这样会浪费资源的,每次都创建线程!
如果有高人 请指条明道!!感谢,再感谢!!
附加我的代码 :
/public class HTTPClientService {
private static Map<String, Class<?>> actMap = new HashMap<String, Class<?>>();
private static Map<String, BaseAction> actInsMap = new HashMap<String, BaseAction>();
/** 线程池维护线程的最少数量 **/
private static int corePoolSize = 50;
/** 程池维护线程的最大数量 **/
private static int maxPoolSize = 100;
/** 线程池维护线程所允许的空闲时间 **/
private static int threadKeepAliveTime = 60;
private static ThreadPoolExecutor threadPool = null;
// 初始化命令
static {
// login
actMap.put(ActTypeConst.ACTTYPE_LOGIN, LoginAction.class);
// add
actMap.put(NewsConst.CMD_ADD_NEWS, PublishAction.class);
// search
actMap.put(NewsConst.CMD_SEARCH_NEWS, SearchAction.class);
threadPool = new ThreadPoolExecutor(corePoolSize, maxPoolSize,
threadKeepAliveTime, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
}
/**
* 执行网络请求
*
* @param msg
* 请求消息类型
* @param cmd
* 请求命令
* @param params
* 参数成對出現
*/
public static void sendAction(Object... params) {
Log.e("[HttpCilentService].sendAction", "--------------");
Hashtable<String, Object> tableHashtable = new Hashtable<String, Object>();
for (int i = 0; i < params.length; i += 2) {
tableHashtable.put((String) params[i], params[i + 1]);
}
//threadPool.execute(new RequestHandlerRunner(tableHashtable));
new Thread(new RequestHandlerRunner(tableHashtable)).start();
}
public static void sendAction(Hashtable<String, Object> table) {
//threadPool.execute(new RequestHandlerRunner(table));
new Thread(new RequestHandlerRunner(table)).start();
}
public static void AddCookiedCookie(String key, String val) {
GetPostNet.AddCookie(key, val);
}
// 消息线程类 网络交互
private static final class RequestHandlerRunner implements Runnable {
private Hashtable<String, Object> requestHandleParam = null;
public RequestHandlerRunner(Hashtable<String, Object> requestHandleParam) {
this.requestHandleParam = requestHandleParam;
}
public void run() {
Looper.prepare();
Log.e("[HttpCilentService].RequestHandlerRunner", "--------------");
HTTPClientService.sendMsg(requestHandleParam);
Looper.loop();
}
}
// 开始线程池 执行网络请求
private static void sendMsg(Hashtable<String, Object> val) {
Context context = null;
String uri = null;
// 过滤掉 服务器不需要的参数
if (null != val.get(ConstantUtil.CURRENT_CONTEXT)) {
context = (Context) val.get(ConstantUtil.CURRENT_CONTEXT);
val.remove(ConstantUtil.CURRENT_CONTEXT);
}
if (null != val.get(BaseConst.URI_MSG)) {
uri = (String) val.get(BaseConst.URI_MSG);
val.remove(BaseConst.URI_MSG);
}
// 发送网络请求
String retString = GetPostNet.sendPost(uri, val);
Log.e("[HttpClientManager].sendMsg----------:", retString.toString());
// 重新添加 环境参数
if (null != context) {
val.put(ConstantUtil.CURRENT_CONTEXT, context);
}
RetDispatchMsg(val, retString);
}
/** 回归主线程 **/
public static void RetDispatchMsg(Hashtable<String, Object> send, String ret) {
Hashtable<String, Object> table = new Hashtable<String, Object>();
table.put(BaseConst.SEND_PARAM, send);
table.put(BaseConst.RECV_PARAM, ret);
Message msg = new Message();
msg.obj = table;
msg.what = 1;
ToolUtil.getMsgHandler().dispatchMessage(msg);
}
/** 主线程 处理返回结果 **/
public static void exeAction(Hashtable<String, Object> param) {
try {
// 得到返回的数据
String back_datas = (String) param.get(BaseConst.RECV_PARAM);
// 自己发送的请求的参数
Hashtable<String, Object> send = (Hashtable<String, Object>) param
.get(BaseConst.SEND_PARAM);
JSONObject json = new JSONObject(back_datas);
json.put(BaseConst.SEND_PARAM, send);
// 得到Action指令的参数
String retMsg = (String) send.get(BaseConst.CMD);
System.out.println("[HTTPClientManager.exeAction()_msg:" + retMsg);
BaseAction insAction = null;
// 检索参数请求
if (actInsMap.containsKey(retMsg)) {
insAction = actInsMap.get(retMsg);
insAction.doProcess(json);
} else {
// 添加新的参数请求
Class<?> cls = actMap.get(retMsg);
insAction = (BaseAction) cls.newInstance();
actInsMap.put(retMsg, insAction);
insAction.doProcess(json);
}
} catch (JSONException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
- android 网络访线程池问题!handler looper
- android线程handler、message、looper
- Android线程间通信机制(Handler Looper )
- Android线程间通信机制(Handler Looper )
- Android线程间通信方式:Handler Looper
- Handler、Message、Looper等Android线程通信
- Android线程 异步 asynctask Looper MessageQueue handler
- android handler,looper子线程间通信
- Android线程间通信 Handler、Looper、MessageQueue
- android开发 handler和looper 线程通信
- Android线程—Handler、Looper、Message、MessageQueue
- Android Handler/Looper/MessageQueue 在新线程中使用Handler
- UI线程、Looper、Handler
- handler looper 和 线程
- Android中关于Handler looper参数设置问题
- Android的Handler,Looper消息机制问题
- 基于Android中Looper , Handler , Message的线程池,轻松解决Sqlite数据库的线程安全问题
- Android中的线程机制(Handler Looper)(二)
- Spring3:Spring3+Hibernate4+RESTful+JSON配置下产生的错误结果
- 安卓 textview 超出限制自动添加省略号
- 动画文件被彻底删除怎么找回呢?
- cmd
- Linux发行版 (列表)
- android 网络访线程池问题!handler looper
- Java实现验证码
- 对Thread.interrupt()方法很详细的介绍
- 【Linux】ls命令源代码(能编译运行通过的)
- 链表的删除插入笔记
- air监听关闭按钮事件
- RedirectResult
- Http协议中消息的编码
- jenkins采用批处理执行python文件