您的位置:首页 > 产品设计 > UI/UE

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

2015-04-12 16:53 495 查看
在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)即可拿到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: