关于android4.0中访问网络不能在主线程中进行以及Handler的使用
2014-10-12 15:50
696 查看
谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是:
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。
主线程的Handler定义:
[java] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
Handler loginHandler = new Handler() {
public void handleMessage(Message msg) {
isNetError = msg.getData().getBoolean("isNetError");
System.out.println(isNetError);
if (proDialog != null) {
proDialog.dismiss();
}
if (isNetError) {
Toast.makeText(LoginActivity.this, "登陆失败:\n1.请检查您网络连接.\n2.请联系我们!",
Toast.LENGTH_LONG).show();
}
// 用户名和密码错误
else {
Toast.makeText(LoginActivity.this, noticeMsg,
Toast.LENGTH_LONG).show();
// 清除以前的SharePreferences密码
clearSharePassword();
}
}
};
主线程里进行登录时候的子线程:
[java] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
// 开一个线程进行登录验证,主要是用于失败,成功直接通过startAcitivity(Intent)转向
Thread loginThread = new Thread(new LoginFailureHandler());
loginThread.start();
子线程的对Handler的使用:
[java] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
/**
* 登录处理函数
* @author wangfeng
* @date 2013-12-19 09:25:42
*
*/
class LoginFailureHandler implements Runnable {
@Override
public void run() {
/*userName = userNameEdit.getText().toString();
password = loginPasswordEdit.getText().toString();*/
//验证地址
String validateURL=url+"/login";
boolean loginState = validateLocalLogin(userNameEdit.getText().toString(), loginPasswordEdit.getText().toString(),
validateURL);
Log.d(this.toString(), "validateLogin");
// 登陆成功
//测试---开始
loginState = true;
//---测试结束
if (loginState) {
// 需要传输数据到登陆后的界面,
Intent intent = new Intent();
intent.setClass(LoginActivity.this, ListViewActivity.class);
Bundle bundle = new Bundle();
/*bundle.putString("MAP_USERNAME", userNameEdit.getText().toString());
intent.putExtras(bundle);*/
// 转向登陆后的页面
proDialog.dismiss();
startActivity(intent);
} else {
// 通过调用handler来通知UI主线程更新UI,
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putBoolean("isNetError", isNetError);
message.setData(bundle);
loginHandler.sendMessage(message);
}
}
}
通过messgae.setData方法吧Budle带进去,然后通过Handler.sendMessage把message放进去.在Handler的handlerMessage中处理。
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。
主线程的Handler定义:
[java] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
Handler loginHandler = new Handler() {
public void handleMessage(Message msg) {
isNetError = msg.getData().getBoolean("isNetError");
System.out.println(isNetError);
if (proDialog != null) {
proDialog.dismiss();
}
if (isNetError) {
Toast.makeText(LoginActivity.this, "登陆失败:\n1.请检查您网络连接.\n2.请联系我们!",
Toast.LENGTH_LONG).show();
}
// 用户名和密码错误
else {
Toast.makeText(LoginActivity.this, noticeMsg,
Toast.LENGTH_LONG).show();
// 清除以前的SharePreferences密码
clearSharePassword();
}
}
};
主线程里进行登录时候的子线程:
[java] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
// 开一个线程进行登录验证,主要是用于失败,成功直接通过startAcitivity(Intent)转向
Thread loginThread = new Thread(new LoginFailureHandler());
loginThread.start();
子线程的对Handler的使用:
[java] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
/**
* 登录处理函数
* @author wangfeng
* @date 2013-12-19 09:25:42
*
*/
class LoginFailureHandler implements Runnable {
@Override
public void run() {
/*userName = userNameEdit.getText().toString();
password = loginPasswordEdit.getText().toString();*/
//验证地址
String validateURL=url+"/login";
boolean loginState = validateLocalLogin(userNameEdit.getText().toString(), loginPasswordEdit.getText().toString(),
validateURL);
Log.d(this.toString(), "validateLogin");
// 登陆成功
//测试---开始
loginState = true;
//---测试结束
if (loginState) {
// 需要传输数据到登陆后的界面,
Intent intent = new Intent();
intent.setClass(LoginActivity.this, ListViewActivity.class);
Bundle bundle = new Bundle();
/*bundle.putString("MAP_USERNAME", userNameEdit.getText().toString());
intent.putExtras(bundle);*/
// 转向登陆后的页面
proDialog.dismiss();
startActivity(intent);
} else {
// 通过调用handler来通知UI主线程更新UI,
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putBoolean("isNetError", isNetError);
message.setData(bundle);
loginHandler.sendMessage(message);
}
}
}
通过messgae.setData方法吧Budle带进去,然后通过Handler.sendMessage把message放进去.在Handler的handlerMessage中处理。
相关文章推荐
- 关于android4.0中访问网络不能在主线程中进行以及Handler的使用
- android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法
- android 访问网络不能在主线程中进行以及在线程中操作UI的解决方法
- 【NetworkOnMainThreadException】关于主线程不能访问网络异常NetworkOnMainThreadException
- iOS开发遇到的坑之三--使用asi框架在xcode下正常运行,但是打包时却不能进行网络访问
- 关于android主线程不能访问网络异常NetworkOnMainThreadException
- 关于hbase中进入shell但是无法使用的问题,以及web界面为什么不能访问。
- 关于android主线程不能访问网络异常NetworkOnMainThreadException
- Android 4.0以后不能在主线程能进行网络访问
- android4.0以上网络访问为什么要开线程,已经Handler的使用
- 关于android主线程不能访问网络异常NetworkOnMainThreadException
- 关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作(九)
- 在symbian第五版中在browser control中使用自己的接入点进行网络访问
- android 2.3 开始主线程不能访问网络
- 关于EAS中供应链管理的kdtable不能直接使用ctrl+c、v进行复制、粘贴的问题
- 关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作(九)
- “在使用Samba进行建立Wisamba无法访问,你可能没有权限使用网络”的一种问题原因及解决