原文地址:http://blog.csdn.net/e_one/article/details/51811266
本文地址: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的实例。
-
-
-
- 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方法里更新进度条
-
-
-
-
-
- @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();
- }
- });
-
- }