Android 接口内的共享优先权

Android 接口内的共享优先权,android,sharedpreferences,retrofit2,Android,Sharedpreferences,Retrofit2,我使用改型从服务器获取并发布一些数据。 我需要用户的URL,所以我将它们保存在共享首选项中,我可以从共享首选项中读取服务文件中的baseurl,但我可以在接口“JsonPlaceHolderApi”中读取它们,因为它需要上下文,另一个错误是属性值必须为常量 第一种解决方案是使用如下url参数: public interface JsonPlaceholderApi{ @GET("{get_url}") Call<List<Messages>> getPo

我使用改型从服务器获取并发布一些数据。 我需要用户的URL,所以我将它们保存在共享首选项中,我可以从共享首选项中读取服务文件中的baseurl,但我可以在接口“JsonPlaceHolderApi”中读取它们,因为它需要上下文,另一个错误是属性值必须为常量


第一种解决方案是使用如下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, ....);
}
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);
    }
}

还有一个棘手的解决方案(我个人不喜欢),但你可以将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(....);
}

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

,因为BaseURL不会更改,您可以将它们静态保存在单独的constants类中的任何位置,并使用类的名称获取它们,而不使用SharedReferences

class Consts {
    public static final String GET_URL = "put_url_here";
    public static final String POST_URL = "put_url_here";
}
然后,在您需要的界面中,只需放置:

Consts.GET_URL


发布代码,而不是将其发布为image.public接口JsonPlaceHolderApi{final SharedReferences mPreferences=PreferenceManager.GetDefaultSharedReferences(JsonPlaceHolderApi.this);SharedReferences.Editor=mPreferences.edit();String get=mPreferences.getString(“get_url”);String post=mPreferences.getString(“post_url”;@GET(GET)Call getPosts();//@Headers({“内容类型:application/json”,“字符集:UTF-8”})@FormUrlEncoded@post(post)Call PostStatus(@Field(“status”)int status,@Field(“id”)int id);}@V-rundPuro-hit你能给我一些建议吗,我被卡住了?你不能把变量传递到注释参数中,它必须是最终的。在你的情况下,试着让String get variable final。不要在注释中发布代码。使用问题中的编辑链接。
Consts.GET_URL
Consts.POST_URL