搜尋

首頁  >  問答  >  主體

android - 上传图片步骤中,把选中的图片存本地的方法耗时如何处理?

for (int i=0;i<paths.size();i++) {
        Bitmap bitmap = ImageCompressUtil.compressBySize(paths.get(i), 1000, 1000);
        ImageTools.savePhotoToSDCard(bitmap, Constants.MyAvatarDir, i + "");
        newPaths.add(Constants.MyAvatarDir + i + ".jpg");
    }

代码如上,paths为一个选中图片地址的list,现在我遍历他,进行压缩,以1、2、3数字来命名,并存入本地,在将压缩后的地址存入newpaths中,传入adapter显示。

现在出现了个问题,选中的图片还没来得及存入本地,覆盖原本以1、2、3数字来命名的图片,就传入adapter中,所以显示的图片是上次存的图片。

我的解决方法是延迟500ms后才传入adapter,显然这不是最好的方法,望大神们提供更加完美的解决方案。

天蓬老师天蓬老师2839 天前727

全部回覆(2)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 15:42:17

    這得看你在哪裡setAdapter和notifyDataSetChanged 了,如果和上面的程式碼區塊處於不同的線程,就可能會出現你的情況了,應該是上面的程式碼區塊執行結束再調adapter刷新方法,這點要確保。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 15:42:17

    你可以用觀察者模式,給你的ImageTools.savePhotoToSDCard方法傳入一個Listener,

    Interface OnSavePhotoToSDCardListener {
        void onSaveSucceed();
        void onSaveFailed();
    }

    所以程式碼應該改成這樣

    for (int i=0;i<paths.size();i++) {
            final int token = i;
            Bitmap bitmap = ImageCompressUtil.compressBySize(paths.get(i), 1000, 1000);
            ImageTools.savePhotoToSDCard(bitmap, Constants.MyAvatarDir, token + "", new OnSavePhotoToSDCardListener() {
                @Override
                public void onSaveSucceed() {
                    newPaths.add(Constants.MyAvatarDir + token + ".jpg");
                }
                
                @Override
                public void onSaveSucceed() {
                    //do something
                }
            });
        }

    當然,建議你正確處理setAdapteradapter.notifyDataSetChanged()呼叫的時機。

    回覆
    0
  • 取消回覆