界面内部共享偏好

时间:2018-10-13 09:59:45

标签: android sharedpreferences retrofit2

我正在使用改造从服务器获取和发布一些数据。 我需要来自用户的URL,所以我将它们保存在共享的首选项中,我能够从共享的首选项中读取服务文件中的baseurl,但是我可以在接口'JsonPlaceHolderApi'中读取它们,因为它需要上下文并且另一个错误是属性值的值必须恒定。

enter image description here

2 个答案:

答案 0 :(得分:1)

第一个解决方案是使用如下网址参数:

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设置为一些常量,并通过从共享首选项中读取它们来在Interceptor中操纵它们(例如替换它们)。

例如:

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(....);
}

然后在您的拦截器的拦截功能中执行以下操作:

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);
    }
}

如果您不知道如何添加拦截器来进行改装,请检查this document

答案 1 :(得分:1)

由于baseUrl不会更改,因此您可以将它们静态地保存在单独的常量类中的任何位置,并使用类的名称获取它们,而无需使用SharedPreferences

  {% if pageClass != "page-home" %}
  {% if bodyClass != "500" %}
  {% if bodyClass != "404" %}
         {% include '_components/type-bg' with {
                    content: {
                        slug: entry.slug|split(' ')|slice(0, 1)|join
                    },
                } only %}
   {% endif %}
   {% endif %}
   {% endif %}

然后,在您需要其中任何一个的界面中,只需放置:

    {% if (pageClass != "page-home") or (if bodyClass != "500") or (if bodyClass != "404")%}

      {% include '_components/type-bg' with {
                    content: {
                        slug: entry.slug|split(' ')|slice(0, 1)|join
                    },
                } only %}

    {% endif %}

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