在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)即可拿到