android简单的UI与后台线程交互的框架

在android中经常出现长时间的任务需要后台线程处理,结束后通知UI线程刷新UI的需求

自己封装了一个简单的UI与后台线程交互的类,代码如下


import java.util.HashMap;
import java.util.Map;

import android.os.Handler;
import android.os.Message;

public abstract class SimpleBackHandler extends Handler{

	private static final int DONE_SUCCESS = 0;
	private static final int DONW_ERROR = 1;
	
	private Map<String, Object> extraObjectMap = new HashMap<String, Object>();
	
	public SimpleBackHandler(){
		super();
	}
	
	public void start(){
		new Thread(){

			/* (non-Javadoc)
			 * @see java.lang.Thread#run()
			 */
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Message message = obtainMessage();
				if (doHandler() ){
					
					message.what = DONE_SUCCESS;
				}
				else {
					message.what = DONW_ERROR;
				}
				sendMessage(message);
			}
			
		}.start();
	}
	
	public void putExtra(String key,Object object){
		extraObjectMap.put(key, object);
	}
	
	public Object getExtra(String key){
		if ( extraObjectMap.containsKey(key) ){
			return extraObjectMap.get(key);
		}
		
		return null;
	}
	
	public abstract boolean doHandler();
	
	public abstract void doneHandler();
	
	public abstract void doneErrorHandler();
	
	/* (non-Javadoc)
	 * @see android.os.Handler#handleMessage(android.os.Message)
	 */
	@Override
	public void handleMessage(Message msg) {
		// TODO Auto-generated method stub
		int result = msg.what;
		if ( result == DONE_SUCCESS ){
			doneHandler();
		}
		else {
			doneErrorHandler();
		}
		
	}

}

用的时候这样:在UI线程中,如Button的onClick方法中

private OnClickListener onBtnClickListener = new OnClickListener() {
		
		@Override
		public void onClick(View view) {
			// TODO Auto-generated method stub
			contentString = contentEditText.getText().toString();
			
			
			new SimpleBackHandler() {
				
				/* (non-Javadoc)
				 * @see com.example.ourtimes.common.SimpleBackHandler#doneErrorHandler()
				 */
				@Override
				public void doneErrorHandler() {
					// TODO Auto-generated method stub
					Toast.makeText(NewsCommentActivity.this, "加载失败", 200).show();
				}

				@Override
				public void doneHandler() {
					// TODO Auto-generated method stub
					Toast.makeText(NewsCommentActivity.this, "加载成功", 200).show();
				}
				
				@Override
				public boolean doHandler() {
					// TODO Auto-generated method stub
					loadData();
					return true;
				}
			}.start();
			
			
			
		}
	};

</pre><p></p><pre>

doHandler()函数为后台线程调用的方法,在这里面写加载数据的代码

根据doHandler()函数的返回结果,true则doneHandler()得到调用,error则doneErrorHandler()得到调用,这两个函数是UI线程,可以在这里面调用UI控件


另外,如果UI线程需要跟后台线程通信,可以用SimpleBackHandler的putExtra(String key,Object object)方法,对应getExtra(String key)即可拿到




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值