2024年3月29日发(作者:)
关于android4.0中访问网络不能在主线程中进行以及
Handler的使用
谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是:
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关
闭,所以这种耗时的操作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的
UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。
主线程的Handler定义:
?
Handler loginHandler = new Handler() {
public void handleMessage(Message msg) {
isNetError = a().getBoolean("isNetError");
n(isNetError);
if (proDialog != null) {
s();
}
if (isNetError) {
xt(, "登陆失败:n1.请检查您网络连接.n
们!",
_LONG).show();
}
// 用户名和密码错误
else {
xt(, noticeMsg,
_LONG).show();
// 清除以前的SharePreferences密码
clearSharePassword();
}
}
};
主线程里进行登录时候的子线程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
?
// 开一个线程进行登录验证,主要是用于失败,成功直接通过startAcitivity(Intent)
1
转向
2
Thread loginThread = new Thread(new LoginFailureHandler());
3
();
子线程的对Handler的使用:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* 登录处理函数
* @author wangfeng
* @date 2013-12-19 09:25:42
*
*/
class LoginFailureHandler implements Runnable {
@Override
public void run() {
/*userName = t().toString();
password = t().toString();*/
//验证地址
String validateURL=url+"/login";
boolean loginState = validateLocalLogin(t().toStr
validateURL);
Log.d(ng(), "validateLogin");
// 登陆成功
//测试---开始
loginState = true;
//---测试结束
if (loginState) {
// 需要传输数据到登陆后的界面,
Intent intent = new Intent();
ss(, );
Bundle bundle = new Bundle();
/*ing("MAP_USERNAME", t().toStri
ras(bundle);*/
// 转向登陆后的页面
s();
startActivity(intent);
} else {
// 通过调用handler来通知UI主线程更新UI,
Message message = new Message();
Bundle bundle = new Bundle();
lean("isNetError", isNetError);
a(bundle);
ssage(message);
}
}
42 }
通过a方法吧Budle带进去,然后通过ssage把message
放进去.在Handler的handlerMessage中处理。


发布评论