改造2:文件上传永远不会完成

时间:2017-06-11 09:33:06

标签: android retrofit2 rx-java2

我正在尝试将任意数量的文件上传到服务器。当我运行请求时,它只是无限期地完成一些工作。抛出没有异常,没有调用回调方法。我正在使用它与RxJava。因此,当我启动请求时调用onSubscribe(),onNext(),onError(),onComplete()永远不会被调用。

修改 如果我只发送" msg"请求有效。没有任何文件的消息,我可以在我的服务器上看到它。 这是我的代码:

@POST("some/address/")
@Multipart
Observable<ResponseBody> sendMessages(@Part("msg") String message,
                                      @Part("companion") Integer companion,
                                      @Part("description") RequestBody description,
                                      @Part List<MultipartBody.Part> files);

模型中的方法:

public Observable<ResponseBody> sendMessage(String message, int companion, RequestBody description, List<MultipartBody.Part> multiParts) {
    return mService.sendMessages(message, companion, description, multiParts).subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());
}

演讲者中的Meethod:

void sendMessage(String message, int companion, List<Uri> fileUris, Context context) {
    List<MultipartBody.Part> multiParts = new ArrayList<>();
    ContentResolver contentResolver = context.getContentResolver();
    for (int i = 0; i < fileUris.size(); i++) {
        Uri uri = fileUris.get(i);
        multiParts.add(createMultipart(uri, contentResolver));
    }
    RequestBody description = createPartFromString("hello, this is description speaking");
    Observable<ResponseBody> observable = mModel.sendMessage(message, companion, description, multiParts);
    observable.subscribe(new Observer<ResponseBody>() {
        @Override
        public void onSubscribe(Disposable d) {
            showProgress();
        }

        @Override
        public void onNext(ResponseBody value) {
            if (getView() != null) {
                getView().dataLoaded();
            }
        }

        @Override
        public void onError(Throwable e) {
            hideProgress();
        }

        @Override
        public void onComplete() {
            hideProgress();
        }
    });
}


@NonNull
private MultipartBody.Part createMultipart(Uri fileUri, ContentResolver contentResolver) {
    File file = new File(fileUri.toString());
    RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
    return MultipartBody.Part.createFormData("file", file.getName(), requestFile);
}

1 个答案:

答案 0 :(得分:0)

所以在挖掘之后,我发现当没有正确地从Uri检索File时会发生这种行为。我用过这个:File file = new File(fileUri.toString());我已经按照FutureStudio关于文件上传的教程的建议使用了FileUtils。