- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用 RxJava 和 Retrofit 上传多张图片时,我遇到了内存不足的问题。请检查下面的 Logcat。
Throwing OutOfMemoryError "Failed to allocate a 68559200 byte allocation with 25165824 free bytes and 56MB until OOM, max allowed footprint 167497024, growth limit 201326592"
07-09 16:10:22.807 8536-8589/com.galisto W/System.err: io.reactivex.exceptions.UndeliverableException: java.lang.OutOfMemoryError: Failed to allocate a 68559200 byte allocation with 25165824 free bytes and 56MB until OOM, max allowed footprint 167497024, growth limit 201326592
07-09 16:10:22.808 8536-8589/com.galisto W/System.err: at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349)
07-09 16:10:22.808 8536-8589/com.galisto W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:69)
07-09 16:10:22.809 8536-8589/com.galisto W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
07-09 16:10:22.809 8536-8589/com.galisto W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
07-09 16:10:22.809 8536-8589/com.galisto W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
07-09 16:10:22.811 8536-8589/com.galisto W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
07-09 16:10:22.811 8536-8589/com.galisto W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
07-09 16:10:22.812 8536-8589/com.galisto W/System.err: at java.lang.Thread.run(Thread.java:764)
07-09 16:10:22.813 8536-8589/com.galisto W/System.err: Caused by: java.lang.OutOfMemoryError: Failed to allocate a 68559200 byte allocation with 25165824 free bytes and 56MB until OOM, max allowed footprint 167497024, growth limit 201326592
07-09 16:10:22.813 8536-8589/com.galisto W/System.err: at java.lang.StringBuilder.toString(StringBuilder.java:410)
07-09 16:10:22.814 8536-8589/com.galisto W/System.err: at java.util.Formatter.toString(Formatter.java:2358)
07-09 16:10:22.814 8536-8589/com.galisto W/System.err: at java.lang.String.format(String.java:2770)
07-09 16:10:22.814 8536-8589/com.galisto W/System.err: at timber.log.Timber$Tree.formatMessage(Timber.java:561)
07-09 16:10:22.814 8536-8589/com.galisto W/System.err: at timber.log.Timber$Tree.prepareLog(Timber.java:547)
07-09 16:10:22.815 8536-8589/com.galisto W/System.err: at timber.log.Timber$Tree.d(Timber.java:427)
07-09 16:10:22.815 8536-8589/com.galisto W/System.err: at timber.log.Timber$1.d(Timber.java:248)
07-09 16:10:22.815 8536-8589/com.galisto W/System.err: at timber.log.Timber.d(Timber.java:38)
07-09 16:10:22.815 8536-8589/com.galisto W/System.err: at com.galisto.utils.network.ServiceFactory.lambda$provideHttpLoggingInterceptor$0$ServiceFactory(ServiceFactory.java:45)
07-09 16:10:22.816 8536-8589/com.galisto W/System.err: at com.galisto.utils.network.ServiceFactory$$Lambda$0.log(Unknown Source:19)
07-09 16:10:22.816 8536-8589/com.galisto W/System.err: at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:199)
07-09 16:10:22.816 8536-8589/com.galisto W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
07-09 16:10:22.816 8536-8589/com.galisto W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
07-09 16:10:22.817 8536-8589/com.galisto W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
07-09 16:10:22.817 8536-8589/com.galisto W/System.err: at okhttp3.RealCall.execute(RealCall.java:77)
07-09 16:10:22.817 8536-8589/com.galisto W/System.err: at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
07-09 16:10:22.818 8536-8589/com.galisto W/System.err: at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:41)
07-09 16:10:22.818 8536-8589/com.galisto W/System.err: at io.reactivex.Observable.subscribe(Observable.java:11040)
07-09 16:10:22.818 8536-8589/com.galisto W/System.err: at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
07-09 16:10:22.818 8536-8589/com.galisto W/System.err: at io.reactivex.Observable.subscribe(Observable.java:11040)
07-09 16:10:22.819 8536-8589/com.galisto W/System.err: at io.reactivex.internal.operators.observable.ObservableOnErrorNext.subscribeActual(ObservableOnErrorNext.java:38)
07-09 16:10:22.819 8536-8589/com.galisto W/System.err: at io.reactivex.Observable.subscribe(Observable.java:11040)
07-09 16:10:22.819 8536-8589/com.galisto W/System.err: at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
07-09 16:10:22.819 8536-8589/com.galisto W/System.err: at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:463)
07-09 16:10:22.820 8536-8589/com.galisto W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
07-09 16:10:22.820 8536-8589/com.galisto W/System.err: ... 6 more
下面是我的代码
private void uploadOrUpdatePost(String nodeId, String nodeName, String title, String detailText, ArrayList<FileItem> files, Post post) {
List<MultipartBody.Part> mFiles = new ArrayList<>();
for (int i = 0; i < files.size(); i++) {
MultipartBody.Part mPart = prepareFilePart("file" + i, files.get(i).getFilePath());
if (mPart != null) {
mFiles.add(mPart);
}
}
RequestBody tokenBody = prepareStringPart(getPrefsHelper().getSessionToken());
RequestBody bokId = prepareStringPart(getPrefsHelper().getBokId());
RequestBody rbNodeId = prepareStringPart(nodeId);
String postID;
if (post == null) {
Timber.d("## uploadOrUpdatePost upload post :" + title);
postID = "";
} else {
Timber.d("## uploadOrUpdatePost update post :" + post.getPostTitle());
if (post.getPostId().contains("-")) {
postID = post.getPostId();
} else {
postID = "";
}
}
RequestBody postId = prepareStringPart(getEmptyStringIfNull(postID));
RequestBody postTitle = prepareStringPart(getEmptyStringIfNull(title));
RequestBody postDetail = prepareStringPart(getEmptyStringIfNull(detailText));
service.uploadPost(tokenBody, bokId, rbNodeId, postId, postTitle, postDetail, mFiles)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.doOnNext(new Consumer<ResAddComment>() {
@Override
public void accept(ResAddComment resAddComment) throws Exception {
if (resAddComment.isSuccess() && post != null) {
mAppData.getPostDao().delete(post.getPostId());
}
}
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SimpleObserver<ResAddComment>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
if (isViewAttached())
getView().showLoader();
}
@Override
public void onNext(ResAddComment response) {
if (response.isSuccess()) {
if (isViewAttached()) {
getView().hideLoader();
getView().onCommentUploaded(R.string.post_uploaded_successfully);
}
} else {
String error = response.getError().getMessage();
if (error != null && isViewAttached()) {
getView().hideLoader();
if (response.isSessionExprired()) {
getView().doLogin();
} else {
// if post is null means upload case so store it rather than update
if (post == null) {
storePostAsDraft(nodeId, nodeName, title, detailText, files, true, true);
} else {
updatePostAsDraft(post, title, detailText, files);
}
}
}
}
}
@Override
public void onError(Throwable e) {
if (isViewAttached()) {
getView().hideLoader();
// if post is null means upload case so store it rather than update
if (post == null) {
storePostAsDraft(nodeId, nodeName, title, detailText, files, true, true);
} else {
updatePostAsDraft(post, title, detailText, files);
}
}
}
@Override
public void onComplete() {
super.onComplete();
}
});
}
服务工厂类源码如下
public class ServiceFactory {
/**
* Creates a retrofit service from an arbitrary class (clazz)
*
* @param clazz Java interface of the retrofit service
* @param endPoint REST endpoint url
* @return retrofit service with defined endpoint
*/
public static <T> T createRetrofitService(final Class<T> clazz, final String endPoint) {
final Retrofit restAdapter = new Retrofit.Builder()
.baseUrl(endPoint)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
.client(provideOkHttpClient())
.build();
return restAdapter.create(clazz);
}
private static OkHttpClient provideOkHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
builder.addInterceptor(provideHttpLoggingInterceptor());
}
builder.connectTimeout(AppConstants.CONNECTION_TIMEOUT_TIME_IN_SECONDS, TimeUnit.SECONDS);
return builder.build();
}
private static HttpLoggingInterceptor provideHttpLoggingInterceptor() {
HttpLoggingInterceptor httpLoggingInterceptor =
new HttpLoggingInterceptor(message ->
Timber.d("## RETROFIT HTTP LOG - %s", message));
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return httpLoggingInterceptor;
}
}
很少有帖子建议 Schedulers.io() 创建多个线程,这就是发生内存不足问题的原因。我尝试使用 Schedulers.computation() 但仍然存在相同的问题。提前致谢。
最佳答案
摆脱 provideHttpLoggingInterceptor()
及其用途,或将其替换为您自己的记录较少信息的拦截器。现在,您正在尝试通过 Timber 记录整个 HTTP 请求。这不适用于更大的请求。
关于android - RxAndroid 在上传多张图片时出现内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51244794/
我在订阅方法中遇到了强制转换问题,我不知道为什么新的观察者会出现这个问题。 Observable getGrade = retrofit .create(GradeS
我正在使用 RxAndroid 在后台做一些事情。这是我的代码: Observable observable = Observable.create(new Observable.OnSubscrib
我正在使用 RxAndroid + Retrofit,我想做的是将 2 个操作合并为一个。例如我有两种方法。第一个在 onNext block 中返回一些 URL。 apiRequests.getAp
public List getOffices(){ final List offices = new ArrayList<>(); Observable observable = Ob
我正在使用适用于 Android 的 RXBle 库。为了从 BLE 外围设备(BLE 设备)读取数据,我最终设置了多个订阅,一个订阅一个,如下所示: Disposable scanSubsc
我正在使用 Android Studio。如何将 RxAndroid 作为子项目包含在我的项目中?我想从源代码构建它。我试过的:- 将其作为 git 子模块包含在内。-将其包含在我的项目 settin
我正在编写以下代码 fragment 以从 firebase 数据库中获取已保存食物的列表,然后使用该列表,我再次从 firebase 数据库中获取单个食物的详细信息。 以下代码工作正常,除了我无法弄
我是 RxJava 的新手。我有一个场景,我想调用第一个登录网络服务 (getLoginObservable),成功后,我想调用另一个网络服务 (getFetchDataObservable) 来获取
在使用 RxJava 和 Retrofit 上传多张图片时,我遇到了内存不足的问题。请检查下面的 Logcat。 Throwing OutOfMemoryError "Failed to alloca
所以我正在做一个由其他人开发的旧项目,碰巧项目中使用了 RxAndroid。 我不得不在一些应用程序的请求中添加缓存处理,而 OkHttp 缓存并没有像我需要的那样做得很好。所以我想出了实现我自己的服
我有这个问题 ;) 我试图调用这个用例,它最后返回一个 Observable。 但是,尽管使用了调度程序,但在主线程上不断被调用。我不知道为什么: 看起来像这样: class MainViewMode
各位程序员好, 我使用 RxAndroid 在按下按钮时每 3 秒进行一次间隔 API 调用。 private final CompositeDisposable disposables = new
我基于 RxJava 和这篇文章实现了一个简单的事件总线:http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-
有人知道如何使用 RxAndroid 从按钮点击中获取点击吗? 不,这不是重复的。改变太多了。 我试过: Events.click() ... 已被删除 RxTextView.editorAction
我正在使用给定的代码 here . 我将这些代码块作为类放在我项目的 util 包中。然后在主要 Activity 课上我写了这个.. class MenuActivity { // Variable
我有一个使用谷歌地图并监听相机变化的应用程序。我的问题是每次更改相机时我都必须请求我的后端。我想做的只是通过使用 RxAndroid/Java 去抖动来限制请求的数量。 我的代码是这样的: Obser
我在我的 Android 应用程序中使用 rxAndroid 和 rxKotlin 来异步处理网络请求。现在我只想在单击 Snackbar 按钮后重试失败的网络请求。 我现在的代码: val citi
我发现自己一遍又一遍地写: Observable.create(new Observable.OnSubscribe() { @Override public void
我正在尝试在 Rx3 中找到 subscribeOn 的主线程 Single.just(getHeavyData()) .subscri
我正在尝试找到一种并行执行请求并在每个可观察的完成时处理它们的方法。尽管所有可观察对象都做出响应时一切正常,但我没有看到一种方法来处理所有错误。 这是zip运算符的示例,它基本上并行执行2个请求: O
我是一名优秀的程序员,十分优秀!