android开发笔记-Handler的理解

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

你可能感兴趣的:(Android开发)