管灌系统巡查员智能手机App
zuoxiao
2025-01-08 94c235c116ebca594662417b5fb2c7378f326c6b
1.优化上传相关代码。
2.修复多个文件上传时进度条显示异常。
6个文件已修改
242 ■■■■■ 已修改文件
app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java
@@ -147,7 +147,7 @@
            @Override
            public void onReUpload(UplodFileState uplodFileState) {
                uplodeImg(uplodFileState);
                FileUploadUtils.uploadFile(AddIssueActivity.this, uplodFileState, uplodFileStates, mAdapter);
            }
        });
        binding.dealButton.setOnClickListener(v -> {
@@ -241,14 +241,6 @@
     * @param result
     */
    private void analyticalSelectResults(ArrayList<LocalMedia> result) {
        //获取当前uplodFileStates所有的图片地址
        Set<String> existingPaths = new HashSet<>();
        for (UplodFileState uplodData : uplodFileStates.values()) {
            existingPaths.add(uplodData.getFilePath());
        }
        //获取在PictureSelector的相册时取消选中的图片
        Set<String> resultPaths = new HashSet<>();
        for (LocalMedia media : result) {
            if (media.getWidth() == 0 || media.getHeight() == 0) {
                if (PictureMimeType.isHasImage(media.getMimeType())) {
@@ -278,63 +270,15 @@
            Log.i(TAG, "文件大小: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize()));
            Log.i(TAG, "文件时长: " + media.getDuration());
            Log.i(TAG, "扩展名: " + media.getMimeType());
            String compressPath = media.getCompressPath();
            //判断是否有这个路径,没有的话上传该图片并添加uplodFileStates中
            if (TextUtils.isEmpty(compressPath)) {
                compressPath = media.getRealPath();
            }
            if (!existingPaths.contains(compressPath)) {
                UplodFileState uplodFileState = new UplodFileState();
                uplodFileState.setFilePath(compressPath);
                if (compressPath.toLowerCase().endsWith(".mp4") || compressPath.toLowerCase().endsWith(".avi") || compressPath.toLowerCase().endsWith(".mkv") || compressPath.toLowerCase().endsWith(".mov")) {
                    // 这是视频文件
                    uplodFileState.setUploadType(UplodFileState.VIDEO_TYPE);
                } else {
                    uplodFileState.setUploadType(UplodFileState.IMG_TYPE);
                }
                uplodFileState.setExtName(media.getMimeType());
                uplodFileStates.put(compressPath, uplodFileState);
                // 执行上传图片的操作
                uplodeImg(uplodFileState);
            }
            resultPaths.add(media.getCompressPath());
            FileUploadUtils.creatAndUploadFile(this, media, uplodFileStates, mAdapter);
        }
        //处理从相册返回时取消的图片处理
        existingPaths.removeAll(resultPaths);
        if (!existingPaths.isEmpty()) {
            List<UplodFileState> toRemove = new ArrayList<>();
            for (String path : existingPaths) {
                for (UplodFileState uplodFileState : uplodFileStates.values()) {
                    if (path.equals(uplodFileState.getFilePath())) {
                        uplodFileState.getThisCall().cancel();
                        toRemove.add(uplodFileState);
                    }
                }
            }
            for (UplodFileState removeFile : toRemove) {
                uplodFileStates.remove(removeFile.getFilePath());
            }
        }
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                boolean isMaxSize = result.size() == mAdapter.getSelectMax();
                int oldSize = mAdapter.getData().size();
                mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize);
                mAdapter.getData().clear();
                mAdapter.getData().addAll(result);
                mAdapter.notifyItemRangeInserted(0, result.size());
            }
        });
        // 获取 result 中没有而 uplodFileStates 中有的地址
        FileUploadUtils.cancelRemovedUploads(result, uplodFileStates);
        // 更新UI
        FileUploadUtils.updateUI(result, mAdapter);
    }
    //上传图片
    private void uplodeImg(UplodFileState uplodFileState) {
        FileUploadUtils.uploadFile(this, uplodFileState, uplodFileStates, mAdapter);
    }
    /**
     * 上报处理结果
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
@@ -148,8 +148,7 @@
            @Override
            public void onReUpload(UplodFileState uplodFileState) {
                uplodFileState.setState(UplodFileState.STATE_UPDING);
                uplodeImg(uplodFileState);
                FileUploadUtils.uploadFile(OrderDealActivity.this, uplodFileState, uplodFileStates, mAdapter);
            }
        });
        binding.dealButton.setOnClickListener(v -> {
@@ -235,13 +234,6 @@
     * @param result
     */
    private void analyticalSelectResults(ArrayList<LocalMedia> result) {
        //获取当前uplodFileStates所有的图片地址
        Set<String> existingPaths = new HashSet<>();
        for (UplodFileState uplodData : uplodFileStates.values()) {
            existingPaths.add(uplodData.getFilePath());
        }
        //获取在PictureSelector的相册时取消选中的图片
        Set<String> resultPaths = new HashSet<>();
        for (LocalMedia media : result) {
            if (media.getWidth() == 0 || media.getHeight() == 0) {
                if (PictureMimeType.isHasImage(media.getMimeType())) {
@@ -270,60 +262,16 @@
            Log.i(TAG, "裁剪宽高: " + media.getCropImageWidth() + "x" + media.getCropImageHeight());
            Log.i(TAG, "文件大小: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize()));
            Log.i(TAG, "文件时长: " + media.getDuration());
            String compressPath = media.getCompressPath();
            //判断是否有这个路径,没有的话上传该图片
            if (TextUtils.isEmpty(compressPath)) {
                compressPath = media.getRealPath();
            }
            if (!existingPaths.contains(compressPath)) {
                UplodFileState uplodFileState = new UplodFileState();
                uplodFileState.setFilePath(compressPath);
                if (compressPath.toLowerCase().endsWith(".mp4") || compressPath.toLowerCase().endsWith(".avi") || compressPath.toLowerCase().endsWith(".mkv") || compressPath.toLowerCase().endsWith(".mov")) {
                    // 这是视频文件
                    uplodFileState.setUploadType(UplodFileState.VIDEO_TYPE);
                }else {
                    uplodFileState.setUploadType(UplodFileState.IMG_TYPE);
                }
                uplodFileStates.put(compressPath, uplodFileState);
                // 执行上传图片的操作
                uplodeImg(uplodFileState);
            }
            resultPaths.add(media.getCompressPath());
            Log.i(TAG, "扩展名: " + media.getMimeType());
            FileUploadUtils.creatAndUploadFile(this, media, uplodFileStates, mAdapter);
        }
        //处理从相册返回时取消的图片处理
        existingPaths.removeAll(resultPaths);
        if (!existingPaths.isEmpty()) {
            List<UplodFileState> toRemove = new ArrayList<>();
            for (String path : existingPaths) {
                for (UplodFileState uplodFileState : uplodFileStates.values()) {
                    if (path.equals(uplodFileState.getFilePath())) {
                        uplodFileState.getThisCall().cancel();
                        toRemove.add(uplodFileState);
                    }
                }
            }
            for (UplodFileState removeFile : toRemove) {
                uplodFileStates.remove(removeFile.getFilePath());
            }
        }
        runOnUiThread(() -> {
            boolean isMaxSize = result.size() == mAdapter.getSelectMax();
            int oldSize = mAdapter.getData().size();
            mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize);
            mAdapter.getData().clear();
            mAdapter.getData().addAll(result);
            mAdapter.notifyItemRangeInserted(0, result.size());
        });
        // 获取 result 中没有而 uplodFileStates 中有的地址
        FileUploadUtils.cancelRemovedUploads(result, uplodFileStates);
        // 更新UI
        FileUploadUtils.updateUI(result, mAdapter);
    }
    //上传图片
    private void uplodeImg(UplodFileState uplodFileState) {
        FileUploadUtils.uploadFile(this, uplodFileState, uplodFileStates, mAdapter);
    }
    /**
     * 上报处理结果
app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java
@@ -168,6 +168,7 @@
                    ? fileStates.get(media.getRealPath())
                    : fileStates.get(media.getCompressPath());
            if (uplodFileState != null) {
                MyLog.d("progressRequestBodyHolder>>>" + "path:" + uplodFileState.getFilePath() + ">>>position:" + position);
                uplodFileState.setAdapterPosition(position);
                MyLog.d("progressRequestBodyHolder>>>" + "State:" + uplodFileState.getState() + ">>>position:" + position + ">>>Progress: " + uplodFileState.getProgress());
@@ -178,7 +179,6 @@
                        viewHolder.maskLayerBg.setVisibility(View.VISIBLE);
                        viewHolder.circleProgressView.setVisibility(View.VISIBLE);
                        viewHolder.circleProgressView.setProgress(uplodFileState.getProgress());
                    } else {
                        viewHolder.circleProgressView.setVisibility(View.GONE);
                        viewHolder.maskLayerBg.setVisibility(View.GONE);
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
@@ -63,6 +63,7 @@
    //文件上传失败重复次数
    int uplodFilerepeatSize = 3;
    ApiService apiService;
    // 管理订阅事件
    private final CompositeDisposable compositeDisposable = new CompositeDisposable();
@@ -302,7 +303,7 @@
    public void uploadFile(final Context context, final UplodFileState uplodData, final UploadFileListener listener, final AddPictureAdapter adapter) {
        if (!TextUtils.isEmpty(uplodData.getFilePath())) {
            MyLog.d("progressRequestBody>>>" + "path:" + uplodData.getFilePath()+">>>uploadType:"+uplodData.getUploadType());
            MyLog.d("progressRequestBody_uploadFile>>>" + "path:" + uplodData.getFilePath() + ">>>uploadType:" + uplodData.getUploadType());
            uplodData.setState(STATE_UPDING);
            File file = new File(uplodData.getFilePath());
            RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
@@ -312,12 +313,15 @@
                int progress = (int) (100 * bytesWritten / contentLength);
                // 例如:更新 ProgressBar 或显示进度
                runOnUiThread(() -> {
                    uplodData.setProgress(progress);
                    // 进度条更新代码
                    if (adapter != null && uplodData.getAdapterPosition() != -1) {
                        adapter.updateProgress(uplodData);
                        //优化不频繁更新进度
                        if (progress - uplodData.getProgress() > 5 || progress == 100){
                            uplodData.setProgress(progress);
                            adapter.updateProgress(uplodData);
                        }
                    }
                    MyLog.d("progressRequestBody>>>" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>上传进度: " + progress + "%");
                    MyLog.d("progressRequestBodyHolder>>>path" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>上传进度: " + progress + "%");
                });
            });
app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java
@@ -1,8 +1,6 @@
package com.dayu.pipirrapp.net;
import com.dayu.pipirrapp.BuildConfig;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java
@@ -1,13 +1,18 @@
package com.dayu.pipirrapp.tool;
import static com.luck.picture.lib.thread.PictureThreadUtils.runOnUiThread;
import android.content.Context;
import android.text.TextUtils;
import com.dayu.pipirrapp.adapter.AddPictureAdapter;
import com.dayu.pipirrapp.bean.net.UplodFileState;
import com.dayu.pipirrapp.net.ApiManager;
import com.dayu.pipirrapp.net.BaseResponse;
import com.dayu.pipirrapp.net.upload.UploadFileListener;
import com.luck.picture.lib.entity.LocalMedia;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import retrofit2.Call;
@@ -38,21 +43,96 @@
    }
    /**
     *  当关闭activity时关闭所有请求
     * 当关闭activity时关闭所有请求
     *
     * @param uplodFileStates
     */
    public static void cancelAllCall(Map<String, UplodFileState> uplodFileStates){
    public static void cancelAllCall(Map<String, UplodFileState> uplodFileStates) {
        try {
            for(UplodFileState uplodFileState:uplodFileStates.values()){
                Call<BaseResponse> mCall =uplodFileState.getThisCall();
            for (UplodFileState uplodFileState : uplodFileStates.values()) {
                Call<BaseResponse> mCall = uplodFileState.getThisCall();
                if (mCall != null) {
                    mCall.cancel();
                }
            }
        } catch (Exception e) {
           e.printStackTrace();
            e.printStackTrace();
        }
    }
    // 更新UI
    public static void updateUI(ArrayList<LocalMedia> result, AddPictureAdapter mAdapter) {
        runOnUiThread(() -> {
            boolean isMaxSize = result.size() == mAdapter.getSelectMax();
            int oldSize = mAdapter.getData().size();
            mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize);
            mAdapter.getData().clear();
            mAdapter.getData().addAll(result);
            mAdapter.notifyItemRangeInserted(0, result.size());
        });
    }
    public static void cancelRemovedUploads(ArrayList<LocalMedia> result, Map<String, UplodFileState> uplodFileStates) {
        List<String> pathsToRemove = new ArrayList<>();
        for (UplodFileState uplodFileState : uplodFileStates.values()) {
            String filePath = uplodFileState.getFilePath();
            // 检查 result 中是否包含该文件路径
            boolean isInResult = false;
            for (LocalMedia media : result) {
                String compressPath = media.getCompressPath();
                //判断是否有这个路径,没有的话上传该图片并添加uplodFileStates中
                if (TextUtils.isEmpty(compressPath)) {
                    compressPath = media.getRealPath();
                }
                if (compressPath.equals(filePath)) {
                    isInResult = true;
                    break;
                }
            }
            // 如果 result 中没有该路径,则将其加入待移除列表
            if (!isInResult) {
                try {
                    //没有该文件以后取消上传
                    uplodFileState.getThisCall().cancel();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                pathsToRemove.add(filePath);
            }
        }
        for (String removeFile : pathsToRemove) {
            uplodFileStates.remove(removeFile);
        }
    }
    /**
     *
     * @param context
     * @param media
     * @param uplodFileStates
     * @param mAdapter
     */
    public static void creatAndUploadFile(Context context, LocalMedia media, Map<String, UplodFileState> uplodFileStates, AddPictureAdapter mAdapter) {
        String compressPath = media.getCompressPath();
        //判断是否有这个路径,没有的话上传该图片并添加uplodFileStates中
        if (TextUtils.isEmpty(compressPath)) {
            compressPath = media.getRealPath();
        }
        if (!uplodFileStates.containsKey(compressPath)) {
            UplodFileState uplodFileState = new UplodFileState();
            uplodFileState.setFilePath(compressPath);
            if (compressPath.toLowerCase().endsWith(".mp4") || compressPath.toLowerCase().endsWith(".avi") || compressPath.toLowerCase().endsWith(".mkv") || compressPath.toLowerCase().endsWith(".mov")) {
                // 这是视频文件
                uplodFileState.setUploadType(UplodFileState.VIDEO_TYPE);
            } else {
                uplodFileState.setUploadType(UplodFileState.IMG_TYPE);
            }
            uplodFileState.setExtName(media.getMimeType());
            uplodFileStates.put(compressPath, uplodFileState);
            // 执行上传图片的操作
            FileUploadUtils.uploadFile(context, uplodFileState, uplodFileStates, mAdapter);
        }
    }
}