【问题标题】:Multiple enqueue in retrofit causing out of memory error?改造中的多个排队导致内存不足错误?
【发布时间】:2016-05-11 16:29:56
【问题描述】:

我正在使用 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)

提前致谢。

【问题讨论】:

    标签: android out-of-memory retrofit retrofit2


    【解决方案1】:

    您应该避免这种方法,因为它会使其成为递归调用。相反,您应该先检查失败函数中的原因,然后重试。还要修正重试次数。

    【讨论】:

    • 因为网络错误,我现在该怎么办?
    • 网络错误有很多种。 1. 如果是 404,那么除了通知用户之外,您无能为力。 2.如果是500,那么你应该重试。
    • 重试使我的应用强制关闭
    • 在重新调用重试之前尝试 call.cancel()。
    【解决方案2】:

    我使用的是 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);
    }
    

    它没有崩溃。试一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 2014-01-25
      相关资源
      最近更新 更多