Android xutils3同时上传多张图片及上传服务的终止

项目中,上传图片功能要求,可根据用户的选择一次上传1-10张图片,并且在上传时仿QQ发送图片时的样式显示上传进度;在退出上传界面再次进入时,进度要继续刷新,在上传因意外中止时在图片中出现刷新按钮,显现“上传失败”,点击刷新按钮可再次上传,如下图所示:


以下对该功能要求的代码逻辑进行说明,Demo后面会上传到资源:
1.在adapter数据适配器中,设置接口回调,在getView()方法中每加载一张图片就在回调方法中进行网络请求,实现此步骤时会遇到同一张图片在getView()方法中加载多次的问题,这样会导致同一张图片多次上传;解决方法是在adapter中新建一个HashMap,代码如下:

  if (Bimp.drr.size()!=0&&!maps.containsKey(Bimp.drr.get(i))){//此时不包含,加入
            maps.put(Bimp.drr.get(i),holder.img_to_upload);
            textMaps.put(Bimp.drr.get(i),holder.tv_upload_fail);
            lineMaps.put(Bimp.drr.get(i),holder.iconfont_title_upload);
            if (UploadFileActivity.uploadImgs.size()==Bimp.drr.size()){//此时非第一次加载
                UploadFileActivity.uploadImgs.put(Bimp.drr.get(i),holder.img_to_upload);
                UploadFileActivity.uploadErrorTexts.put(Bimp.drr.get(i),holder.tv_upload_fail);
                UploadFileActivity.uploadErrorLines.put(Bimp.drr.get(i),holder.iconfont_title_upload);
            }
            loadDatas.loadData(i,maps,textMaps,lineMaps);
        }

maps即为新建的HashMap对象,这样在每次执行getView()时,同一张图片只会请求一次,loadDatas.loadData();为接口回调的方法

2.从上传界面退出再进入时,adapter会重新加载数据,maps也会重新创建,因此为继续能加载上传图片的进度,使用静态变量的HashMap,实时更新保存当前adapter加载的控件,继续刷新上传进度,上述代码中以UploadFileActivity开始的变量即为存储adapter当前控件的HashMap,这样可保持adapter数据的实时更新,上传图片的代码为:

/**
	 * 上传图片,只支持单张上传
	 * @param url 上传图片的url地址
	 * @param filePath 上传图片文件的路径
	 * @param tab 上传的标识
     */
	public void uploadImg(String url, final String filePath, final int tab){
		RequestParams params=new RequestParams(url);

		params.setMultipart(true);//设置表单传送
		params.setCancelFast(true);//设置可以立即被停止
		params.addBodyParameter("Filedata", new File(filePath),"multipart/form-data");

		Callback.Cancelable cancelable=x.http().post(params, new Callback.ProgressCallback<String>() {
			@Override
			public void onSuccess(String result) {
				Log.i("uploadImg","result-->"+result);
				if (mCallback!=null){
					mCallback.successCallback(tab,result);
				}
			}

			@Override
			public void onError(Throwable ex, boolean isOnCallback) {
				Log.i("uploadImg","ex-->"+ex.getMessage());
				if (mCallback!=null){
					mCallback.errorCallback(tab);
				}

				if (scheduleCallback!=null){
					scheduleCallback.uploadErrorCallback(filePath);
				}
			}

			@Override
			public void onCancelled(CancelledException cex) {
				Log.i("upload","onCancelled");
			}

			@Override
			public void onFinished() {
			}

			@Override
			public void onWaiting() {

			}

			@Override
			public void onStarted() {

			}

			@Override
			public void onLoading(long total, long current, boolean isDownloading) {

			/*	Log.i("uploadImg","total-->"+total);
				Log.i("upload","isDownloading-->"+isDownloading);
				Log.i("uploadImg","current-->"+current);*/
				if (scheduleCallback!=null){
					scheduleCallback.uploadScheduleCallback(total,current,filePath);
				}
			}
		});
		
		//cancelable.cancel();//终止上传
	}


在设置为表单传送时,需设置params.setMultipart(true);//设置表单传送,参数params.addBodyParameter("Filedata", new File(filePath),"multipart/form-data");其中“FileData”可随意设置,params.setCancelFast(true);表示可中断传送,若想终止上传服务,调用cancelable.cancel();即可

猜你喜欢

转载自blog.csdn.net/androidforwell/article/details/70229853