bindservice与使用监听器更新进度+观察者模式
2017-03-09 16:03
381 查看
startservice与启动service的控件不会有关联,如果想两者需要通信得使用bindservice,另外bindservice当启动service的控件被销毁后会导致service的销毁,所以要同时使用startservice与bindservice。
更新进度可以用broadcastreceiver来做,但是对于多线程下载,如果用广播这个系统级别的东西,势必会出问题,所以建议用监听器来做。
一、bindservice的使用:
http://blog.csdn.net/guolin_blog/article/details/11952435
首先新建service,自定义binder类,把binder对象返回
然后在activity中新建ServiceConnection 对象,在onServiceConnected()中返回的binder中获取service对象,并且可以控制service的行为。
二、监听器模式
http://www.jianshu.com/p/d38818f643e4
首先监听谁就在谁里面写接口,把需要的数据传出去
然后在activity塞一个接口的实现,进行监听。
最后给出系统自带的观察者模式
观察者模式传送门
更新进度可以用broadcastreceiver来做,但是对于多线程下载,如果用广播这个系统级别的东西,势必会出问题,所以建议用监听器来做。
一、bindservice的使用:
http://blog.csdn.net/guolin_blog/article/details/11952435
首先新建service,自定义binder类,把binder对象返回
public class DownTestService extends Service { private MyBinder myBinder = new MyBinder(); @Nullable @Override public IBinder onBind(Intent intent) { //返回binder对象 return myBinder; } /** * 在binder里执行下载暂停下载,获取service对象 */ class MyBinder extends Binder { //开始下载 public void startDownload() { } //暂停下载 public void stopDownload() { } //获取service对象 public DownTestService getService() { return DownTestService.this; } } }
然后在activity中新建ServiceConnection 对象,在onServiceConnected()中返回的binder中获取service对象,并且可以控制service的行为。
public class DownloadTestActivity extends AppCompatActivity { private Button btnStartService = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download_test); initView(); } private void initView() { btnStartService.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { //启动服务下载 case R.id.btnStartService: Intent intent = new Intent(DownloadTestActivity.this, DownTestService.class); intent.putExtra("url", downloadUrl1); //先绑定服务后启动下载 startService(intent); bindService(intent, conn, BIND_AUTO_CREATE); } } //服务绑定成功后会调用onServiceConnected(),第三个参数即我们传回来的binder private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myBinder = (DownTestService.MyBinder) service; //绑定成功后开始下载 myBinder.startDownload(); //绑定成功之后获取service对象 downloadService = myBinder.getService(); } @Override public void onServiceDisconnected(ComponentName name) { } }; } }
二、监听器模式
http://www.jianshu.com/p/d38818f643e4
首先监听谁就在谁里面写接口,把需要的数据传出去
public class DownTestService extends Service { private GetProgressListener getProgressListener = null; public interface GetProgressListener { void onProgressChange(int progress); } public void setProgressChangeListener(GetProgressListener aGetProgressListener) { getProgressListener = aGetProgressListener; } //在进度更新的位置调用接口的方法,把进度**传出去**到activity中 @Override public void onProgress(long finished, long total, int progress) { if(getProgressListener!=null){ getProgressListener.onProgressChange(progress); } }
然后在activity塞一个接口的实现,进行监听。
public class DownloadTestActivity extends AppCompatActivity { downloadService.setProgressChangeListener(//downloadService是通过bindservice返回的binder对象来获取的。 new DownTestService.GetProgressListener() { @Override public void onProgressChange(int progress) { pbService.setProgress(progress);//此处拿到监听器暴露出来的进度进行更新进度条。 } }); }
最后给出系统自带的观察者模式
观察者模式传送门
相关文章推荐
- 多线程异步编程(2):创建多个线程执行任务,同时更新进度条,使用观察者模式,利用事件通知界面更新。移除对Form的引用,彻底解除界面与逻辑的耦合
- 使用观察者模式解决ViewPager加载照片中更新其他Fragment内容
- 大文件 and 多下载任务的封装(二)--观察者模式--实现下载进度的实时更新
- 【android】 使用观察者模式更新用户资料
- 观察者模式(状态改变-通知-更新行为)
- 观察者模式使用心得
- 如何使用委托与事件来实现观察者模式
- 使用观察者模式实现Java应用程序设计MVC模式
- 使用PB调用API自动更新(非FTP模式)(五、复制函数F_CONNECT_COPYFILE)
- QuteCom手记:使用Event类实现观察者模式
- 观察者模式使用WebForm实现的例子
- 使用PB调用API自动更新(非FTP模式)(四、统计复制文件数量函数F_CONNECT_COPYCOUNT)
- Notification使用详解之三:通过服务更新进度通知&在Activity中监听服务进度
- 使用观察者模式在 Silverlight 中切换用户控件
- C#中使用委托和事件实现观察者模式(observer pattern)
- 使用javascript模拟观察者模式和事件监听广播机制
- 使用模式窗口 并更新父窗口
- 使用PB调用API自动更新(非FTP模式)(三、连接函数F_CONNECT_COPYSERVER)
- 观察者模式 observer 模拟监听器的实现
- WCF中使用观察者模式实现事件通知