Как решить Android исключение нулевого указателя экземпляра MultiDex Apllication? - PullRequest
0 голосов
/ 15 февраля 2020

Я хочу выполнить интеграцию службы ядра API в моем проекте Android. Мой основной класс обслуживания выглядит следующим образом:

public class TestApplication extends MultiDexApplication {
    private static final String LOG_TAG_NETWORK = "GNetwork";
    public static JacksonConverterFactory factory;
    private static TestApplication instance;
    private OkHttpClient.Builder okHttpBuilder;
    private TestService testtService;
    private Location lastKnownLocation;

public static TestApplication getInstance() {
    return instance;
}

@Override
public void onCreate() {
    super.onCreate();
    instance = this;

    Pref.init(this);

    okHttpBuilder = new OkHttpClient.Builder();
    okHttpBuilder.connectTimeout(UrlConstants.CONNECT_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
            .readTimeout(UrlConstants.READ_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
            .writeTimeout(UrlConstants.WRITE_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
    if (BuildConfig.LOG_ENABLED) {
        HttpLoggingInterceptor httpLoggingInterceptor =
                new HttpLoggingInterceptor(message -> Log.d(LOG_TAG_NETWORK, message));
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        okHttpBuilder.addInterceptor(httpLoggingInterceptor);
    }
    factory = getJacksonConverterFactory();
}

@NonNull
private JacksonConverterFactory getJacksonConverterFactory() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    return JacksonConverterFactory.create(objectMapper);
}

public void setupRetrofit() {

    String BASE_URL = "http://xxxxx";

    Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(okHttpBuilder.build())
            .addConverterFactory(factory).build();

    testService = retrofit.create(TestService.class);
}

public TestService getTestService() {
    return testService;
    }
}

Затем я создаю экземпляр из этого основного класса. Но здесь мое постоянное значение getIntance возвращает ноль.

TestApplication.getInstance().setupRetrofit();

Я не могу этого понять. GetInstance метод всегда возвращает null;

В моем приложении build.gradle файл multiDexEnabled true.

Как решить эту ситуацию?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2020

никогда не используйте экземпляр приложения, как это. для получения экземпляра приложения вам нужна активность, и в своей деятельности вы можете использовать

    static TestApplication getInstance(Activity activity) {
        if (instance == null)
            instance = ((TestApplication) activity.getApplication());
        return instance;
    }

, это решит ваши проблемы, но способ реализации модернизации и ее использования не является наилучшей практикой. Вы можете найти лучший способ, который не требует активности.

0 голосов
/ 15 февраля 2020

После включения Multidex

Заменить на: -

publi c Класс Приложение расширяет MultiDexApplication {

public static final String TAG = Application.class.getSimpleName();

@Override
public void onCreate() {
    super.onCreate();

    ApplicationHelper.initDatabaseHelper(this);
    PostInteractor.getInstance(this).subscribeToNewPosts();
}

}

0 голосов
/ 15 февраля 2020

изменить getInstance ()

с этого

public static TestApplication getInstance() {
return instance;
}

на этот

public static TestApplication getInstance() {
instance=new TestApplication();
return instance;
}

, а также удалить эта строка от создания

instance = this;
...