【问题标题】:Retrofit calls inside for loop , java.lang.OutOfMemoryError:在 for loop 中进行改造调用,java.lang.OutOfMemoryError:
【发布时间】:2021-05-06 04:49:24
【问题描述】:

我在 for 循环中有一个嵌套的改造服务器请求调用,但出现错误

java.lang.OutOfMemoryError: 无法分配 2359304
我该如何解决这个问题。有没有其他方法可以循环改造服务器调用..

List<ID> idList = new Arraylist<>();
int idCompleted = 0;

idList.size() 大于30000;

这是我的功能:

 public void getNewList(){
        for(int i=0;i<idList.size();i++) {
            int iValue = i;
            Call<String> call = RetrofitClient.getInstance().getMyApi().getList(idList.get(i).getId(), "A");
            call.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    String responseA = response.body().toString();

                    Call<String> call1 = RetrofitClient.getInstance().getMyApi().getList(idList.get(iValue).getId(), "B");
                    call1.enqueue(new Callback<String>() {
                        @Override
                        public void onResponse(Call<String> call, Response<String> response) {

                            String responseB = response.body().toString();
                            

                            addToFile(responseA,responseB);

                            idCompleted ++;
                            if (idCompleted == idList.size()) {
                                
                                    Log.i("Finished : ", "Yes")
                            }else {
                               getNewList();
                            }

                        }

                        @Override
                        public void onFailure(Call<String> call, Throwable t) {
                           idCompleted ++;
                            if (idCompleted == idList.size()) {
                                
                                    Log.i("Finished : ", "Yes")
                            }else {
                               getNewList();
                            }
                        }
                    });
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    idCompleted ++;
                            if (idCompleted == idList.size()) {
                                
                                    Log.i("Finished : ", "Yes")
                            }else {
                               getNewList();
                            }

                }
            });

        }

【问题讨论】:

    标签: java android retrofit2


    【解决方案1】:

    如果要在 RecyclerView 上显示数据,您应该在 RecyclerView Adapter 中调用网络请求,这样它一次只会执行几个。

    如果没有,您应该修改您的循环,使其一次只能调用几个,而不是像现在一样同时调用所有。

    没有设备有足够的 RAM 来同时处理 30000 个网络请求。同时做2-3个即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      相关资源
      最近更新 更多