Retrofit中的多个enqueue是否会导致内存不足错误?

3

我正在使用retrofit2完成我的项目。当我的调用失败时,我会再次重复相同的调用。这样重复调用导致我的应用程序强制关闭。 当我查看日志时,我得到了以下错误日志。我认为这是由于对同一调用进行多个排队所引起的。因此,在排队之前,我调用了取消操作。但它不起作用,仍然出现强制关闭。

FATAL EXCEPTION: main
Process: com.SocialMob, PID: 27846
java.lang.OutOfMemoryError: pthread_create (stack size 16384 bytes) failed: Try again
at java.lang.VMThread.create(Native Method)
at java.lang.Thread.start(Thread.java:1029)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:920)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1338)
at okhttp3.Dispatcher.enqueue(Dispatcher.java:112)
at okhttp3.RealCall.enqueue(RealCall.java:78)
at okhttp3.RealCall.enqueue(RealCall.java:70)
at retrofit2.OkHttpCall.enqueue(OkHttpCall.java:104)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.enqueue(ExecutorCallAdapterFactory.java:58)
at com.SocialMob.Activities.SplashActivity.VersionCheck(SplashActivity.java:184)
at com.SocialMob.Activities.SplashActivity.access$500(SplashActivity.java:38)
at com.SocialMob.Activities.SplashActivity$1.onFailure(SplashActivity.java:177)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$2.run(ExecutorCallAdapterFactory.java:75)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)

感谢您提前考虑。
谢谢。
2个回答

0
你应该避免这种方法,因为它会使它成为一个递归调用。相反,你应该先在失败函数中检查原因,然后重试。同时修复重试次数。

由于网络错误,现在我该怎么办? - user6318834
有许多类型的网络错误。
  1. 如果是404,则除了通知用户之外,您无法做任何事情。
  2. 如果是500,则应重试。
- Umair Adil
重试会导致我的应用程序强制关闭。 - user6318834
在重试调用之前尝试使用call.cancel()。 - Umair Adil

0

我正在使用Retrofit 2.0.2,并且在我的清单文件中有这个标签:

android:largeHeap="true"

我正在尝试像这样在失败时重试:
@Override
public void onFailure(Call<AudioResponse> call, Throwable error) {
    loading.setVisibility(View.GONE);
    if (mAdapter.getItemCount() == 0) {
        SetErrorContent();
    }
    Log.e("Error", error.getMessage() + "");

    call.cancel();
    call.clone().enqueue(this);
}

它不会崩溃。试一下吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接