当前位置: 首页 > 知识库问答 >
问题:

RxJava:无法为RX创建调用适配器。可观察到的错误

施梓
2023-03-14
public interface ApiInterface {
    @Multipart
        @POST("/android/upload/index.php")
        Observable<Response> postImage(@Part MultipartBody.Part image,   @Part("name") RequestBody name);
}
public interface Model {
 Observable<Response> postImage(MultipartBody.Part image, RequestBody name);
}
public class ModelImpl implements Model {
    ApiModule apiModule = ApiModule.getInstance();
 @Override
    public Observable<Response> postImage(MultipartBody.Part image, RequestBody name) {
        return apiModule.getApi().postImage(image,name);
    }
}
RxPhoto.requestUri(context, TypeRequest.GALLERY)
        .flatMap(new Func1<Uri, Observable<Response>>() {
            @Override
            public Observable<Response> call(Uri uri) {

                File file = new File(uri.getPath());
                RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
                MultipartBody.Part body = MultipartBody.Part.createFormData("upload", file.getName(), reqFile);
                RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "upload_test");
                return model.postImage(body, name);


            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Response>() {

                    @Override
                    public void onError(Throwable e) {

                        Log.d(tag, "error:" + e);

                    }

                });

错误:java.lang.IllegalArgumentException:无法为apiInterface.postimage方法的rx.Observable创建调用适配器

UPD:

我将接口和其他更改为:

Observable<uploadAnswer>


    public class uploadAnswer {

        @SerializedName("success")
        @Expose
        private String success;

        public String getSuccess() {
            return this.success;
        }

    }
public String getRealPathFromURIPath(Uri contentURI) {
        Cursor cursor = context.getApplicationContext().getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) {
            return contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            return cursor.getString(idx);
        }
    }

在那之后,我有一个错误(这是不是意味着,我是对的??):

错误:Android.os.NetworkOnMainThreadException

UPD3:

RxPhoto.requestUri(context,TypeRequest.GALLERY)
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(new Action1<Uri>(){

                    @Override
                    public void call(Uri uri) {

                        Log.d(tag, "up => " + uri);

                        File file = new File(uri.getPath());
                        RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
                        MultipartBody.Part body = MultipartBody.Part.createFormData("upload", file.getName(), reqFile);
                        RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "upload_test");

                        //model.postImage(body, name);

                        GetDataSubscription = model.postImage(body,name)
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe();

                    }

                })
                .subscribe();
@Multipart
    @POST("/upload/index.php")
    Observable<String> postImage(@Part MultipartBody.Part image, @Part("name") RequestBody name);

*E/AndroidRuntime:致命异常:main process:info.masterskaya.om.near,pid:8618 java.lang.IllegalStateException:Exception抛出在scheduler.worker线程上。添加onerror处理。在rx.internal.schedules.scheduledaction.run(scheduledaction.java:60),在android.os.handler.handlecallback(handler.java:733),在android.os.handler.dispatchmessage(handler.java:95),在android.os.handler.dispatchmessage(handler.java:136),在android.app.activitythread.loop(handler.java:136),在android.app.activitythread.main(teinit.java:779)在com.android.internal.os.zygoteinit.main(zygoteinit.java:595)在dalvik.system.nativeStart.main(本机方法)由:rx.exceptions.onerrornotimplementedexception://document/image:34:open failed:ENOENT(没有这样的文件或目录)在rx.observable$26.onerror(observable.java:8524)在rx.observers.safesubscriber.java:157)在atorObserveon$ObserveonSubscriber.checkTerminated(operatorObserveon.java:264)在rx.internal.operators.operatorobserveon$observeonsubscriber.call(operatorobserveon.java:207),在rx.internal.schedulers.scheduledaction.run(scheduledaction.java:55),在android.os.handler.handleCallback(handler.java:733), 在Android.os.handler.DispatchMessage(Handler.java:95) 在Android.os.looper.loop(looper.java:136), 在Android.app.activitythread.main(activitythread.java:5017) 在java.lang.reflect.Method.invokenative(本机方法) 在java.lang.reflect.method.invoke(Method.java:515) 在com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:779) 在com.android.internal.os.zygoteinit.main(zygoteinit.java:595) 在dalvik.system.nativeStart.main(原生方法) 由:java.io.filenotfoundexception://document/image:34:open failed:ENOENT(没有这样的文件或目录),位于libcore.io.iobridge.open(iobridge.java:409),位于java.io.fileinputstream.(fileinputstream.(fileinputstream.java:78),位于ofkio.ockio.source(ockio.java:163),位于okhttp3.requestbody:3.3.writeTo(requestbody.java:117),位于OggingInterceptor.Intercept(httploggingInterceptor.java:186)在OKHTTP3.realcall.applicationInterceptorchain.proceed(realcall.java:187)在OKHTTP3.realcall.getResponseWithInterceptorchain(realcall.java:160)在OKHTTP3.realcall.execute(realcall.java:57)在Retrofit2.OKHTTP3.realcall.execute(realcall.java:174)在SetProducer(subscriber.java:211)在rx.internal.operators.operatorsubscribeon$1$1.setproductor(operatorsubscribeon.java:76)在rx.subscriber.setproductor(subscriber.java:205)在retrofit2.adapter.rxjava.rxjavacalladapterFactory$callonsubscribe.call(rxjavacalladapterFactory$callonsubscribe.call(rxjavacalladapterFactory$callonsubscribe.call eSubscribe(observable.java:8741)在rx.internal.operators.operatorsubscribeon$1.call(operatorsubscribeon.java:94)在rx.internal.schedulers.scheduledaction.run(scheduledaction.java:55)在java.util.concurrent.executors$runnableadapter.call(executors.java:422)在java.util.concurrent.futuretask.run(PoolExecutor$ScheduleDFutureTask.run(ScheduledThreadpoolexecutor.java:265)位于java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1112)位于java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:587),位于java.lang.thread.run(thread.java:841)

                                                                        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
                                                                        at libcore.io.IoBridge.open(IoBridge.java:393)
                                                                        at java.io.FileInputStream.<init>(FileInputStream.java:78) 
                                                                        at okio.Okio.source(Okio.java:163) 
                                                                        at okhttp3.RequestBody$3.writeTo(RequestBody.java:117) 
                                                                        at okhttp3.MultipartBody.writeOrCountBytes(MultipartBody.java:171) 
                                                                        at okhttp3.MultipartBody.writeTo(MultipartBody.java:113) 
                                                                        at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:186) 
                                                                        at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
                                                                        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160) 
                                                                        at okhttp3.RealCall.execute(RealCall.java:57) 
                                                                        at retrofit2.OkHttpCall.execute(OkHttpCall.java:174) 
                                                                        at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171) 
                                                                        at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80) 
                                                                        at rx.Subscriber.setProducer(Subscriber.java:211) 
                                                                        at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76) 
                                                                        at rx.Subscriber.setProducer(Subscriber.java:205) 
                                                                        at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152) 
                                                                        at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138) 
                                                                        at rx.Observable$2.call(Observable.java:233) 
                                                                        at rx.Observable$2.call(Observable.java:225) 
                                                                        at rx.Observable.unsafeSubscribe(Observable.java:8741) 
                                                                        at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) 
                                                                        at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
                                                                        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
                                                                        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                                                                        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
                                                                        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
                                                                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                        at java.lang.Thread.run(Thread.java:841)* 

UPD4:

我有一些结果。

接口:

@Multipart
@POST("/upload/index.php")
Observable<Void> postImage(@Part MultipartBody.Part image, @Part("name") RequestBody name);
RxPhoto.requestUri(context,TypeRequest.GALLERY)
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(new Action1<Uri>(){

                    @Override
                    public void call(Uri uri) {

                        Log.d(tag, "up => " + uri);
                        Log.d(tag, "getPath => " + getPath(context,uri));

                        String URL = getPath(context,uri);

                        File file = new File( URL+"" );

                        RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
                        MultipartBody.Part body = MultipartBody.Part.createFormData("upload", file.getName(), reqFile);
                        RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "upload_test");

                        GetDataSubscription = model.postImage(body,name)
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe();

                    }

                })
                .subscribe();
getPath(context,uri)

12-09 05:37:55.770 102 30-10372/*D/OKHTTP:--857D62DE-296C-4D23-8683-92B3B340A658 12-09 05:37:55.770 102 30-10372/D/OKHTTP:内容-处置:表单-数据;name=“name”12-09 05:37:55.770 102 30-10372/d/okhttp:content-transfer-encoding:binary 12-09 05:37:55.770 102 30-10372/d/okhttp:content-type:multipart/form-data;Charset=UTF-8 12-09 05:37:55.770 102 30-10372/D/OKHTTP:内容-长度:11 12-09 05:37:55.770 102 30-10372/D/OKHTTP:upload_test 12-09 05:37:55.770 102 30-10372/D/OKHTTP:--857D62DE-296C-4D23-8683-92B3B340A658--12-09 05:37:55.770102-30-10372/D/OKHTTP:-->结束帖子(26620-byte body)12-09 05:37:55.800102-30-10334/D/GOOGLECER TificateSimpl:获取了363个Google证书12-09 05:37:56.340 102 30-10230/I/Choreographer:跳过了42帧!应用程序可能在其主线程上做了太多的工作。12-09 05:37:56.390 102 30-10372/D/OKHTTP:<--200 OK http://www./upload/index.php(604ms)12-09 05:37:56.390 102 30-10372/D/OKHTTP:日期:星期五,2016年12月9日10:37:56 GMT 12-09 05:37:56.390 102 30-10372/D/OKHTTP:服务器:Apache 12-09 05:37:56.390 102 30-10372/D/OKHTTP:vary:Accept-Encoding 12-09 05:37:56.390 102 30-10372/D/OKHTTP:content-type:text/http ML;Charset=UTF-8 12-09 05:37:56.390 102 30-10372/D/OKHTTP:X-Cache:MISS from T7.RU12-09 05:37:56.390 102 30-10372/D/OKHTTP:X-Cache-Lookup:MISS from T7.RU:6666 12-09 05:37:56.390 102 30-10372/D/OKHTTP:Connection:keep-alive 12-09 05:37:56.390 102 30-10372/D/OKHTTP:OKHTTP:OKHTTP-Sent-Millis:1481279876016 12-09 05:37:56.390 102 30-收到-米勒:1481279876396 12-09 05:37:56.390 102 30-10372/*D/OKHTTP:{“结果”:“失败”}12-09 05:37:56.390 102 30-10372/***D/OKHTTP:<-结束HTTP(18字节正文)

服务器:

<?php

    $file_path = "up/";

    $file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
    if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path) ){
        echo '{"result": "success"}';
    } else{
        echo '{"result": "fail"}';
    }
 ?>

UPD5:

php测试代码

<?php

    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    define('ROOT_DIR', dirname(__FILE__));

    $file_path = ROOT_DIR . "";

    $file_path = $file_path . basename( $_FILES['upload']['name']);
    if(move_uploaded_file($_FILES['upload']['tmp_name'], $file_path) ){
        echo '{"result": "success"}';
    } else{
        echo '{"result": "fail"}';
    }
 ?>

我所有的问题都是在设备上使用正确的uri。尝试API16、19和24都成功

共有1个答案

施同
2023-03-14

问题在以下部分:

Observable<Response>

响应始终需要指定的正文类型。看起来您的响应没有主体,所以您应该用以下内容替换它:

Observable<Result<Void>>

...并使用result.response()请求响应

 类似资料:
  • 我在创建一个将返回对象列表的可观察对象时遇到了麻烦。我有一个ID列表,想对我的数据库提出一个请求。在这种情况下,我使用的是Firebase。当得到一个结果时,我希望将这些对象中的每一个编译成一个列表,然后返回该列表。我需要在返回之前等待所有的对象都返回。我在我的视图模型反序列化器类中这样做。这是我的代码。 有几种方法可以从firebase数据库中返回数据,我可以返回Documentsnapshot

  • 我在读一篇教程: http://code.tutsplus.com/tutorials/getting-started-with-reactivex-on-android--cms-24387 它特别关注RxAndroid,但它与RxJava中的几乎相同。我不确定我是否完全理解了这个概念。 下面我写了一个方法,然后是一个示例用法。 我的问题是:这是实现我的函数以便我可以在其他线程上异步运行它们的正

  • 我正在尝试开发我的第一个RxJava例子 我有一个带有文本框和三个按钮的主要活动。第一个按钮初始化单独类中的整数。第二个按钮订阅一个可观察量,该可观察量假定正在观察整数。第三个按钮将整数的值减小 1。 这是我的密码 和班级 当我尝试使用 订阅时,它只是给了我 的值(即 6),然后它给了我完成! 然后我尝试使用,认为我需要使用,只是而不是,但后来我得到了一个返回的空的,然后再次完成! 有人能帮助我从

  • 我试图理解当我使用 在或之后,在我使用时返回true 我知道是一次性的。isDisposed()返回false。有人能解释一下到底发生了什么吗?。我理解一个写得很好的观察。create不能在onComplete()或onError()之后发出项。

  • 我将Ionic3与一个一起使用。我有下面的函数,出于某种原因,即使该函数只被调用一次,第三行也会被触发两次。 问题 这引起了一个问题,因为正在获取第二个订阅的值,并且第一个订阅丢失,不允许我取消订阅。 问题 如何创建一个只有一个订阅的

  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。