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都成功
问题在以下部分:
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可能不会保留源可观察的顺序。如果订单对您很重要,请使用。