Я делаю простой вызов Google Map API с Retrofit в моем приложении
Я вижу ошибку в консоли GooglePlay и на одном из моих телефонов, но не могу воспроизвести ошибку с помощью эмулятора и других моих телефонов - все просто работает нормально.
Это java.lang.IndexOutOfBoundsException
Похоже, ошибка появляется, только если приложение остается нетронутым несколько дней или недель.
И PlayConsole говорит, что проблема не появляется в версии Android ниже, чем 7.0
Пожалуйста, покажите код ниже
Stacktrace указывает на ошибку в строке при запуске цикла try-catch. Я предположил, что у меня просто ошибка, потому что я пытался "получить (0)", когда нет данных в ответ. Но я воспроизвел это поведение, и мой блок «catch» сработал отлично, приложение не вылетало
И в конце концов, почему трассировка стека указывает строку 76, а не строку 77, где произошел фактический вызов?
Вот метод с ошибкой
Call<Geocod> response = geocoding_interfaces.CoordinatesFactory.getInstance().getCoordinates(coordinates, private_key);
try { //HERE IS STRING 76
incomelocation = response.execute().body().getResults().get(0).getGeometry().getLocation();
askinglocation = from_loc_to_string(incomelocation);
} catch (IOException | IndexOutOfBoundsException e) {
askinglocation = locations;
}
Вот обратный звонок
@Override
public void onLoadFinished( Loader<List<Datum>> loader, List<Datum> data) {
int id = loader.getId();
if (id == R.id.weather_loader_id) {
if (data != null) {
// here some methods to work with data
} else
{
// here some methods to work errors out
}
вот основной интерфейс Retrofit
import android.support.annotation.NonNull;
import android.util.Log;
import java.util.concurrent.TimeUnit;
import dev.eyesless.simple_weather_for_fishermans.BuildConfig;
import dev.eyesless.simple_weather_for_fishermans.geocoding_responce_classes.Geocod;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface geocoding_interfaces {
String BASE_URL = "https://maps.googleapis.com/maps/api/";
@GET("geocode/json")
Call<Geocod> getCoordinates(@Query("address") String order, @Query("key") String key);
class CoordinatesFactory {
private static geocoding_interfaces service;
public static geocoding_interfaces getInstance() {
if (service == null) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override public void log(@NonNull String message) {
Log.e("MY_TAG", "OkHttp: " + message);
}
});
logging.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BASIC : HttpLoggingInterceptor.Level.NONE);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(logging) // TODO: 15.10.2017 remoove before production
.retryOnConnectionFailure(false)
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
service = retrofit.create(geocoding_interfaces.class);
return service;
}
else {
return service;
}
}
}
}
StackTrace:
java.lang.RuntimeException:
at android.support.v4.content.ModernAsyncTask$3.done (ModernAsyncTask.java:161)
at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
at java.util.concurrent.FutureTask.run (FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
at java.lang.Thread.run (Thread.java:784)
Caused by: java.lang.IndexOutOfBoundsException:
at java.util.ArrayList.get (ArrayList.java:437)
at dev.eyesless.simple_weather_for_fishermans.repository.WeatherLoader.loadInBackground (WeatherLoader.java:76)
at dev.eyesless.simple_weather_for_fishermans.repository.WeatherLoader.loadInBackground (WeatherLoader.java:21)
at android.support.v4.content.AsyncTaskLoader.onLoadInBackground (AsyncTaskLoader.java:302)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground (AsyncTaskLoader.java:57)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground (AsyncTaskLoader.java:45)
at android.support.v4.content.ModernAsyncTask$2.call (ModernAsyncTask.java:138)
at java.util.concurrent.FutureTask.run (FutureTask.java:266)