Общие настройки внутри интерфейса - PullRequest
0 голосов
/ 13 октября 2018

Я использую модификацию для получения и публикации некоторых данных с сервера.Мне нужен URL-адрес от пользователя, поэтому я сохранил их в общих настройках, я могу прочитать baseurl в файле службы из общих настроек, но я могу прочитать их в интерфейсе «JsonPlaceHolderApi», так как для этого требуется контекст, и другая ошибказначения атрибута должно быть постоянным.

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Поскольку baseUrls не будут меняться, вы можете сохранять их статически в любом месте в отдельном классе констант и получать их, используя имя класса без использования SharedPreferences

class Consts {
    public static final String GET_URL = "put_url_here";
    public static final String POST_URL = "put_url_here";
}

, затем в интерфейсегде вам нужен любой из них просто поместите:

Consts.GET_URL

или

Consts.POST_URL
0 голосов
/ 18 октября 2018

Первое решение состоит в том, чтобы использовать параметры URL, как это:

public interface JsonPlaceholderApi{

    @GET("{get_url}")
    Call<List<Messages>> getPosts(@Path("get_url") String getUrl);

    @FormUrlEncoded
    @POST("{post_url}")
    Call<List<MessageStatus>> PostStatus(@Path("post_url") String postUrl, ....);
}

, и когда вы хотите вызвать ваш API-пароль, который URL, как показано ниже:

api.getPosts(mPreferences.getString("get_url" , ""))
api.PostStatus(mPreferences.getString("post_url" , ""), ...)

Существуеттакже хитрое решение (которое я лично ненавижу), но вы можете установить URL-адреса для некоторых констант и манипулировать ими в своем перехватчике (например, заменяя их), читая их из общих настроек.

Например:

public interface JsonPlaceholderApi{

    public static final String GET_POSTS_DUMMY_URL = "GET_POSTS_DUMMY_URL";
    public static final String POST_STATUS_DUMMY_URL = "POST_STATUS_DUMMY_URL";

    @GET(GET_POSTS_DUMMY_URL)
    Call<List<Messages>> getPosts();

    @FormUrlEncoded
    @POST(POST_STATUS_URL)
    Call<List<MessageStatus>> PostStatus(....);
}

А затем в вашей модифицированной функции перехвата Interceptor сделайте что-то вроде этого:

public class RetrofitInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Request.Builder requestBuilder = request.newBuilder();
        // ...
        requestBuilder.url(request.url().toString()
            .replace(
                JsonPlaceholderApi.GET_POSTS_DUMMY_URL,
                mPreferences.getString("get_url" , "")
            )
            .replace(
                JsonPlaceholderApi.POST_STATUS_DUMMY_URL,
                mPreferences.getString("post_url" , "")
            )
        );
        request = requestBuilder.build();
        // ...
        return chain.proceed(request);
    }
}

И если вы не знаете, как добавить перехватчик для проверки дооснащения этот документ

...