将多个图像上传到队列中的服务器

时间:2016-08-08 07:18:44

标签: android file-upload android-service retrofit

使用案例:将后台队列中的图片上传到服务器,图片可以是手机内存中存储的网址或图片文件。

我想要的内容将队列中的项目数量限制为3,并将模糊图像显示为在活动中的回收站视图中上传的实际图像的占位符,每个占位符上都有一个进度条指示多少它的上传。在每个占位符的顶部有三个按钮,可以暂停,取消或恢复上传图像。

当前情况:目前,我在Multipart中使用Retrofit 1.9.0上传图片,此活动内部正在进行此服务调用。

我无法弄清楚如何使用Retrofit或任何其他库来取消,暂停或恢复多部分POST请求,以及如何将UI事件与api服务线程联系起来。我可以从服务更新UI,但是如何从UI中的事件(暂停/恢复/取消)更新服务中的某些内容?

我该如何处理这个用例?我需要使用服务吗?我可以根据服务中执行的请求在其他活动中显示进度指示器吗?这个过程的架构应该是什么? 我不需要它的代码,但是如果有一些与此相关的有用的引用,我想阅读并测试它以最终得出我的方法。

3 个答案:

答案 0 :(得分:1)

这是你可以做的:这是通过传递图像的路径从设备上传图像的示例代码。类似地,你可以为图像网址执行此操作, 步骤:1)创建一个将为每个图像运行的线程。 2)之后每个图像上传都会给你回复。 3)现在,您可以为每个图像更新UI。

//TODO: Multiple file upload
public class FileUpload implements Runnable {
    Context context;
    String uploadApiUrl, uploadFilePath, fileType;
    int uploadId;
    LocalQueenDataBase localQueenDataBase;
    Activity activity;

    public FileUpload(Context context, ,String uploadApiUrl, String uploadFilePath, String fileType, int uploadId) {
        this.context = context;
        this.uploadApiUrl = uploadApiUrl;
        this.uploadFilePath = uploadFilePath;
        this.fileType = fileType;
        this.uploadId = uploadId;
        localQueenDataBase = new LocalQueenDataBase(context);
        Thread uploader = new Thread(this);
        uploader.start();
    }

    @Override
    public void run() {
        try {
            executeMultipartPost();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void executeMultipartPost() throws Exception {
        try {
            String originalPath = uploadFilePath;
            if (uploadFilePath == null) {
                uploadFilePath = originalPath;
            }
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("your api url");
            httppost.addHeader("put your header if required")
            FileBody bin = new FileBody(new File(uploadFilePath));
            StringBody fileTypeBody = new StringBody(fileType);
            StringBody uploadIdBody = new StringBody(uploadId + "");

            MultipartEntity reqEntity = new MultipartEntity();
            reqEntity.addPart("file", bin);
            reqEntity.addPart("fileType", fileTypeBody);
            reqEntity.addPart("uploadId", uploadIdBody);
            httppost.setEntity(reqEntity);

            HttpResponse response = httpclient.execute(httppost);
            HttpEntity resEntity = response.getEntity();
            String retSrc = EntityUtils.toString(resEntity);//Render your response
            //TODO: update your UI for each uploaded image by creating the Handler
             Message msg = handler.obtainMessage();
             handler.sendMessage(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        try {
            uploadGalleryRecyclerAdapter = new UploadGalleryRecyclerAdapter(getApplicationContext(), PostUpdateActivity.this, localQueenDataBase.getGallery());
            postUpdateRV.setAdapter(uploadGalleryRecyclerAdapter);
            if (localQueenDataBase.getGallery().size() > 3)
                gallerylayoutManager.scrollToPosition(localQueenDataBase.getGallery().size() - 2);
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.handleMessage(msg);
    }
};

希望这会对你有所帮助。

答案 1 :(得分:1)

我强烈建议您使用Square's Tape,同时上传多个文件/图像,同时查看易用性,效率,错误处理,排队系统。如果您一次只使用一个文件,请尝试在任何Android Http客户端中使用任何多部分文件上载

这就是Square's Tape:

Tape是Square,Inc。提供的Android和Java队列相关类的集合。

QueueFile是一个快速,快速,基于文件的FIFO。从实例添加和删除是O(1)操作并且是原子的。写是同步的;在操作返回之前,数据将写入磁盘。底层文件的结构可以在进程甚至系统崩溃中生存,如果在变更过程中抛出I / O异常,则更改将中止。

ObjectQueue表示任意对象的排序,可以由文件系统(通过QueueFile)或仅在内存中支持。

TaskQueue是一个特殊的对象队列,它包含任务,这些对象具有被执行的概念。实例由外部执行程序管理,该执行程序准备并执行排队任务。

答案 2 :(得分:1)

a{
text-decoration: none;
}