类QQ切换多帐号时,如何停止多线程的网络请求/切换数据

zhujunhua2012 2014-06-17 11:26:41
类似QQ的多帐号切换功能,比如原先有AB两帐号(数据库对应DB_A,DB_B),当前A帐号登录,当切换到B帐号时,需要先停止A帐号情况下的所有网络请求(可能有多个子线程中存在着网络请求),然后从DB_A切换到DB_B,但此时可能某些子线程已经拿到了DB_A的数据库实例,并正在对DB_A进行读写操作,此时如果只是简单地将数据库实例切换到DB_B,会将原先打算插入到DB_A的数据,插入到DB_B中。
如上,存在两个问题,停止子县城的网络请求,切换数据库,求各位大神指点一二。。。
...全文
314 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujunhua2012 2015-09-18
  • 打赏
  • 举报
回复
自己顶一下, 各位给点思路...
zhujunhua2012 2015-03-19
  • 打赏
  • 举报
回复
好久之前的问题了,最近考虑了下线程池,发现是解决不了问题的。 线程池的#shutdown,#shutdownNow只是不增加新的线程处理,但是对于已经执行的线程,是没有办法中断的(只是调用了线程的#interrupt,对于没有sleep,wait这些的子线程,是没有作用的),各位有什么方法吗? 求大神。。。
zhujunhua2012 2014-06-19
  • 打赏
  • 举报
回复
引用 5 楼 birdsaction 的回复:
当你切换的时候 ,可以弹出一个Dialog ,在后台把需要处理的逻辑处理完 ,停止上一次的线程 或者 无用的数据抛弃掉。
但是切换帐号的时候,不知道有多少线程,几个网络请求在发生。。。 是要用线程池来处理吗?(有可能造成最新的网络请求没线程处理,处于等待状态,然后界面Dialog也一直在等待状态吗?) 网络请求呢?
tcmakebest 2014-06-17
  • 打赏
  • 举报
回复
应该针对不同的帐号生成不同的数据库操作类,用实例方法操作各自的数据. 楼主这种情况可能使用了公共变量来表示当前正操作的数据库.
Birds2018 2014-06-17
  • 打赏
  • 举报
回复
当你切换的时候 ,可以弹出一个Dialog ,在后台把需要处理的逻辑处理完 ,停止上一次的线程 或者 无用的数据抛弃掉。
zhujunhua2012 2014-06-17
  • 打赏
  • 举报
回复
引用 2 楼 birdsaction 的回复:
第一 所有的数据加标志位 类似于QQ号码或者ID把,,当你切换的时候 数据ID或者QQ号码也改变了,但是之前的线程还在运转,所以需要在线程里面判断当前的ID 是否和切换的ID一样 如果一样即可获取数据更新数据,如果不一样 那就抛弃掉这个数据。

new Thread(){
   public void run(){
            String _id1 = getCurrentQQID();
            String _id2 = getAccountQQID();
            if (_id1.equals(_id2)) {
                  //一样 即可操作网络,更新数据
  
            }  else { 
                 //不一样return; 或者...
             }
   } 
}.start();


我目前的实现,类似这种方法。 在数据库操作类和网络请求操作类里面,定义一个全局的int变量mFlag,和一个static的int变量sFlag;获取数据库/网络操作实例的时候,赋值mFlag=sFlag;切换帐号时,sFlag++;在数据库/网络操作时,比较mFlag == sFlag,判断是否return。 但是感觉,这个应该只是一个临时的方案,有点治标不治本的感觉。
zhujunhua2012 2014-06-17
  • 打赏
  • 举报
回复
引用 1 楼 tcmakebest 的回复:
应该针对不同的帐号生成不同的数据库操作类,用实例方法操作各自的数据. 楼主这种情况可能使用了公共变量来表示当前正操作的数据库.
在调用的地方,是根据帐号生成的数据库操作类的实例,但是在封装的数据库操作类中 SQLiteDatabase database这个是static的(类似单例的效果),否则会出现数据库未close等一系列错误。所以就会出现调用处拿到的是操作DB_A的连接,但是切换B后就变成操作DB_B的连接了。 你的意思,应该是数据库操作类不是单例的。但这样就有数据库未close等问题。。。
Birds2018 2014-06-17
  • 打赏
  • 举报
回复
第一 所有的数据加标志位 类似于QQ号码或者ID把,,当你切换的时候 数据ID或者QQ号码也改变了,但是之前的线程还在运转,所以需要在线程里面判断当前的ID 是否和切换的ID一样 如果一样即可获取数据更新数据,如果不一样 那就抛弃掉这个数据。

new Thread(){
   public void run(){
            String _id1 = getCurrentQQID();
            String _id2 = getAccountQQID();
            if (_id1.equals(_id2)) {
                  //一样 即可操作网络,更新数据
  
            }  else { 
                 //不一样return; 或者...
             }
   } 
}.start();


80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧