1.Handler的定义:
在主线程中创建, 用于接收子线传递过来的数据, 更新主线程UI.
2.Handler特点:
1.Handler可以分发Message对象和Runnable对象到主线程中
2.每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)
3.详细解释:
对于一些耗时操作如:用户登录时请求网络数据, 文件读写等, 需要创建一个子线程(以免造成主线程假死现象).在子线程
中处理这些耗时操作, 这过程中需要更新主线程UI的话, 将结果传递给handler , 通过handler更新UI.
4.为什么要通过handler更新主线程, 在子线程更新主线程UI有问题吗:
因为主线程view是线程不安全的. 如果在子线程中更新主线程UI, 会造成线程直接的竞争,这样会很危险. 需要统一到主线程更新UI操作.
5. 例子:
已加载用户信息为例:
1). 在主线程创建Handler
mHandler = new Handler(){
//取消ProgressDialog提示框, 通过Toast提示用户数据加载成功. @Override public void handleMessage(Message msg) { switch (msg.what) { case TASK_PROCED: if(mProgressDialog!=null){ mProgressDialog.cancel(); } Toast.makeText(UserDetailsActivity.this, "用户信息加载成功", Toast.LENGTH_LONG).show(); } } };
2). 在子线程中发送数据到主线程:
private class LoadUser extends AsyncTask<Void, Void, String>{
@Override
protected String doInBackground(Void... params) {
try {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(UserDetailsActivity.this);
String userName = Preferences.getUserName(prefs);
String passowrd = Preferences.getUserPassword(prefs);
Foursquared foursquared = (Foursquared) getApplication();
Foursquare foursquare = foursquared.getFoursquare();
//根据用户名和密码重新更新用户信息
User user = foursquare.loginUser(userName, passowrd);
if(user!=null){
Log.i("UserDetailsActivity" , "mail = "+user.getEmail());
}else{
Log.i("UserDetailsActivity" , " user is null");
}
Preferences.storeUser(prefs.edit(), user);
if(user!=null){
Message msg = new Message();
msg.what = TASK_PROCED ;
mHandler.sendMessage(msg); //向主线程发送数据.
}
} catch (FoursquareCredentialsException e) {
e.printStackTrace();
} catch (FoursquareParseException e) {
e.printStackTrace();
} catch (FoursquareException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
};
参考文章: http://dev.10086.cn/cmdn/wiki/index.php?doc-view-4582.html