本文地址:http://blog.csdn.net/e_one/article/details/51811266
场景:博主做个文件传输的项目,有名称为TcpService的类。该类继承至Service类,主要负责Socket通信,在Socket传输文件的时候,我们需要实时更新UI来提高用户体验。假设我们更新的是SessionActivity类的UI,该类继承至Activity。并且SessionActivity绑定TcpService。现在我们就要用回调函数在TcpService类里面更新SessionActivity里面的UI。
1.我们写一个接口,名称为OnTransProgressChangeListener。
public interface OnTransProgressChangeListener{
void onProgressChange(long current,long max);
}
current参数表示当前进度,max表示进度的总长
2.在TcpService类里声明该接口的字段。
private OnTransProgressChangeListener onTransProgressChangeListener;
并声明一个方法,该方法只有一个参数,它是OnTransProgressChangeListener类型的,目的是接受SessionActivity的传来的OnTransProgressChangeListener实例。
public void setOnTransProgressChangeListener(OnTransProgressChangeListener onTransProgressChangeListener)
{
this.onTransProgressChangeListener=onTransProgressChangeListener;
}
在TcpService需要更新UI的地方,只需要按参数调用:
onTransProgressChangeListener.onProgressChange(current,max);
3.用SessionActivity实现OnTransProgressChangeListener接口。
由于SessionActivity是绑定TcpService的,所以我们可以在他们连接的时候得到TcpService的实例。并调用TcpService实例的setOnTransProgressChangeListener方法给TcpService设置OnTransProgressChangeListener的实例。
/**
* 监听Activity与Service关联情况
*/
ServiceConnection serviceConnection=newServiceConnection() {
@Override
public void onServiceConnected(ComponentName name,IBinder service) {
TcpService.SimpleBindersimpleBinder=(TcpService.SimpleBinder) service;
tcpService=simpleBinder.getService();
//设置进度条更新
tcpService.setOnTransProgressChangeListener(SessionActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName name) {
//不连接
}
};
4.在SessionActivity的onProgressChange方法里更新进度条
/**
* 更新进度条,用回调函数
* @param current
* @param max
*/
@Override
public void onProgressChange(final long current, final long max) {
runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.setProgress((int)((double)current/max*100));
progressDialog.setMax(100);
progressDialog.show();
if(current==max)
progressDialog.hide();
}
});
}