Robospice 配置服务器 URL

Robospice configure server URL

我正在使用 Robospice 来管理我的 API,我想在我的登录屏幕上实现一个功能,允许更改我的应用程序中将使用哪个服务器 URL。

在此登录屏幕上 activity 我有不同的 editText 字段:用户名、登录和 url(服务器)和登录按钮。

我已经实现了 m Robospice 服务:

public class MyRetrofitService extends RetrofitGsonSpiceService {

    public static final String BASE_URL = "https://myUrl.com";

    public static final String PREF_FILE_NAME = "PrefFile";
    public static final String PREF_USERNAME = "username";
    public static final String PREF_PASSWORD = "password";
    public static final String PREF_URL = "url";

    @Override
    public void onCreate() {
        super.onCreate();
        addRetrofitInterface(MyInterface.class);
    }

    @Override
    protected String getServerUrl() {
        // SharedPreferences return my current url saved by the user
        String serverUrl = getApplicationContext().getSharedPreferences(PREF_FILE_NAME,Context.MODE_PRIVATE).getString("url",BASE_URL);

        // I want to change this value
        return serverUrl;
    }
}

这是我的登录名 Activity:

public class WelcomeActivity extends Activity {

    public SpiceManager spiceManager = new SpiceManager(MyRetrofitService.class);

    @Override
    protected void onStart() {
       super.onStart();
       spiceManager.start(this);

    }

    @Override
    protected void onStop() {
       super.onStop();
       spiceManager.shouldStop();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
        // Initialise UI + sharedPreference
         ....
    }

   View.OnClickListener loginButtonListener = new View.OnClickListener() {
       @Override
        public void onClick(View v) {
            // get data from UI EditText
            setUrl(urlAddress.getText().toString())
            login(usersname.getText().toString(), password.getText().toString());
        }
    };

    public void setURL(String url) {

       // Save login details in sharedPreferences
       Auxiliar.editor.putString(MyRetrofitService.PREF_URL, url);
       Auxiliar.editor.putString(MyRetrofitService.PREF_USERNAME, usersname.getText().toString());
       Auxiliar.editor.putString(MyRetrofitService.PREF_PASSWORD, password.getText().toString());
       Auxiliar.editor.commit();

       Intent myservice = new Intent(this, MyRetrofitService.class);
       stopService(myservice);

       spiceManager.shouldStop();
       spiceManager = new SpiceManager(MyRetrofitService.class);
       spiceManager.start(getBaseContext()); // at this point should trigger getServerURl() in my RobospiceService but it doesn't
    } 

    private void login() {
       LoginService loginRequest = new LoginService(username, password);
       spiceManager.execute(loginRequest, new HTTPRequestListener());
    }
}

所以我正在做的是停止我的 SpiceManager 服务并重新启动此服务以强制触发 MyRetrofitService class 中的此 getServerURL 方法并更改 url。

我检查了一下,这个服务真的停止了,然后又重新启动了,但它没有触发 getServerURl() 来改变这个 url。

我做错了什么吗?您是否有想法更改此 URL 并保存新的?

RetrofitSpiceService 不是为满足这样的要求而设计的(有关详细信息,请参阅代码)。

我建议覆盖 getRetrofitService() 方法并提供一个实现,该实现将为每个不同的服务器 URL 构建一个单独的 RestAdapter 或实现您自己的 RetrofitSpiceService 与现有实施类似,但可满足您的需求。