android多线程下载更新UI问题

最近在做一个多线程下载图片,然后更新UI的功能。
而且一直没有出现问题,因为下载速度挺快,而两个线程下完完成时间又一般情况下都是不一样的
  • 问题一:
    在一次我偶然发现有两个图片的确的确是在同一时刻下载好,那么就在写入数据库的时候出了问题,写进去的时候两张图片的名称居然都是可能稍微较后一张图片的名称,也就是说把它给覆盖掉了。

download(furl,savDir,fname_save,context,new DownloadCallback() {
                                    @Override
                                    public void status(boolean status) {//下载成功的回调
                                        if(status) {//下载成功
                                            if(APP.developMode) {
                                                System.out.println("下载完成");
                                                System.out.println("下载完成存"+fname_save);
                                                System.out.println("下载完成:Thread"+Thread.currentThread().getId());
                                            }
                                            //下载成功写入数据库
                                            downloadedWriteToDB(fname_save,fname,context,ad);
                                        }else {
                                            if(APP.developMode) {
                                                System.out.println("下载失败");
                                            }
                                        }
                                    }
                                });

这样写就出了问题,因为每个图片下载完成之后就要回到这里,而在这之前又是循环下载,所以如果是同时回到这里就又可能使用的存入数据相同的情况。后面是直接使用使它各自自己运行
download(url,savDir,fname_save,fname,context,temp);
让它们在自己的那块空间里写数据库。所以这个问题是解决了。

问题二:在更新UI的时候,每个线程下完图片完成之后都会用handler.sendMessage来同时handler去更新UI,不打断电是没有出现问题的,但是只要我一打断点,相当于每个线程下载完成后都卡在那里。后面我移除断点居然会发现通知更新UI的数据又被最后一个下载好的给覆盖掉了,通知的消息全是最后一个那个。
一开始是用的Message.getData()来赋值的传给handler,通过看里面的函数

    public Bundle getData() {
        if (data == null) {
            data = new Bundle();
        }

        return data;
    }
可以知道,其实是用的同一个bundle,然后在handler那里从里面取数据出来,我就以为是在这里后面进入的把前面的给覆盖了。

然后我又采取了用队列的方式来传入,
用的LinkedBlockingQueue的put和take来存和取。
理论上是不存在这个最后一个把前面一个覆盖掉的问题了。但是在我打断点的时候还是覆盖掉了。

在我即将准备放弃的时候,想到了,之前认为肯定不可能出错的位置,因为我每次都是采用的局部变量,以为每次都开辟的新空间来执行,不会存在数据混乱问题,只有在通知handler的时候才执行到了共同资源,但是我忽略了一个基本的东西

download(url,savDir,fname_save,fname,context,temp);

在每一次调用下载的时候传的temp是同一个,而java里调用函数传值过去,我印象里好像是传的地址过去,这样在函数里拿到地址来执行,所以我大概知道了可能出的问题。
后面就在传值那里,每次都new的一个新的传进去
temp=new bean();
那么每个操作的空间就不一样了,最后运行之后发现真的解决了这个问题。

我的文笔不好,也不知道表达清楚没有。如果有遇到相同问题的,希望给了你们一个思路。

Android 交流513210053

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值