ArrayIndexOutOfBoundsException - 改进调用

时间:2016-06-28 21:00:46

标签: android retrofit2

我正在尝试在PUT实例上调用Retrofit方法:

Response<UpdateUserProfileResponse> response = App.getService().updateUserProfile(//A good 26 parameters).execute();

updateUserProfile()中的参数是String,Boolean和一个List<MyObject>的混合。当我调用此方法时,我收到以下错误:

Throwing new exception 'length=238; index=1366' with unexpected pending exception: java.lang.ArrayIndexOutOfBoundsException: length=238; index=1366
06-28 21:53:12.458 3928-6610/com.subby.development A/art: art/runtime/thread.cc:1329]   at retrofit2.Response

更新

我发现了这个问题。有两个RealmList<BackgroundString>导致了这个问题。当我评估两个RealmLists时,我得到:

Unable to evaluate the expression method threw 'java.lang.IllegalStateException' exception.

6 个答案:

答案 0 :(得分:29)

对于其他在这个问题上绊脚石的人,最可能的实际问题是:https://issuetracker.google.com/issues/37078190 即在棉花糖/ 23(甚至24)上即时运行在Android运行时中存在问题。 Android 8/26 +具有官方修复程序,但是对于大多数人而言,禁用Instant Run应该足够了。

还:
https://github.com/square/retrofit/issues/1486
https://github.com/square/retrofit/issues/1506

答案 1 :(得分:14)

抛出新异常'length = 1120; index = 2310',带有意外的未决异常:java.lang.ArrayIndexOutOfBoundsException:length = 1120; index = 2310

在Android Nougat和Oreo上运行正常,但在棉花糖中却遇到了问题。我只是通过关闭“即时运行”来解决此问题。通过去做 文件->设置->构建,执行,部署->即时运行并禁用即时运行选项

答案 2 :(得分:8)

我也面临着同样的问题:

禁用Instant Run解决了该问题。

遵循以下路径:

  

设置->构建,执行,开发-> Instant Run

答案 3 :(得分:1)

如果您在后台线程或任何新的Handler()。postDelayed()中使用此函数,请在 UI线程中使用此API调用。

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    APIClient.getAPIService().getEffects(Constants.apiKey).enqueue(new Callback<POJOCLASS>() {
                        @Override
                        public void onResponse(Call<POJOCLASS> call, Response<POJOCLASS> response) {
                            if (response.body().error.msg == null) {

                            }
                        }

                        @Override
                        public void onFailure(Call<POJOCLASS> call, Throwable t) {

                        }
                    });
                }
            });

尝试此代码

答案 4 :(得分:0)

将你的代码包装到try catch块中,就像我做的那样

 Call<JsonObject> call = null;
        try
        {
            call = apiService.getUserList(getUsersListRequestModel);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

答案 5 :(得分:0)

当我遇到这个问题时,我正在使用库的下一个版本:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

毕业:

com.android.tools.build:gradle:4.1.3

并像这样初始化 Retrofit 实例:

Retrofit.Builder()
        .baseUrl(URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

但是将 GsonConverterFactory 初始化更改为 GsonConverterFactory.create(GsonBuilder().create()) 解决了问题:

Retrofit.Builder()
        .baseUrl(URL)
        .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
        .build()