我正在使用Retrofit,在每项任务中我都要做这样的事情:
public class MyTask extends AsyncTask<String, String, String> {
private void someMethod() {
final RestAdapter restAdapter = new RestAdapter.Builder()
.setServer("http://10.0.2.2:8080")
.build();
final MyTaskService apiManager = restAdapter.create(MyTaskService.class);
}
// ...
}
将此代码设为DRY的好方法是什么?
答案 0 :(得分:44)
正如Jake所说,你应该使用singleton pattern以确保始终使用相同的实例。
以下是一个例子:
public class ApiManager {
public interface GitHubService {
@GET("/users/{user}/repos")
List<Repo> listRepos(@Path("user") String user);
}
private static final String API_URL = "https://api.github.com";
private static final RestAdapter REST_ADAPTER = new RestAdapter.Builder()
.setEndpoint(API_URL)
.setLogLevel(LogLevel.FULL)
.build();
private static final GitHubService GIT_HUB_SERVICE = REST_ADAPTER.create(GitHubService.class);
public static GitHubService getService() {
return GIT_HUB_SERVICE;
}
}
您可以像这样使用此示例中的服务:
ApiManager.getService().listRepos(...);
答案 1 :(得分:43)
RestAdapter
和生成的服务实例(在本例中为MyTaskService
)都是极其昂贵的对象,应该用作单例。
这意味着您只需拨打restAdapter.create
一次,并在每次需要互动时重复使用MyTaskService
的同一个实例。
我不能强调这一点。
您可以使用常规单例模式,以确保在任何地方只使用这些对象的单个实例。依赖注入框架也可用于管理这些实例,但如果您尚未使用它,则会有点过分。
答案 2 :(得分:5)
首先使用所有常见行为声明您的父类
public abstract class MyAbstractTask extends AsyncTask<String, String, String> {
protected void someMethod() { //note that i change private to protected
final RestAdapter restAdapter = new RestAdapter.Builder().setServer("http://10.0.2.2:8080").build();
final MyTaskService apiManager = restAdapter.create(MyTaskService.class);
}
}
然后,你用每个任务扩展它
public class MyTask extends MyAbstractTask {
//your someMethod() is available from everywhere in your class
}
public class MyOtherTask extends MyAbstractTask {
//your someMethod() is available from everywhere in your class
}
但我不知道你在哪里使用restAdapter和apiManager,如果实际上每个任务需要创建一次,因为你可能可以在这些任务之外创建它。
如果你在外面创建它们,然后你需要在你的任务中使用某些东西,那么记住Dependency_injection模式也是很好的。
此外,您应该避免在类中使用硬编码值,例如http://10.0.2.2:8080
您应该至少使用final static final String server= "http://10.0.2.2:8080"
然后使用它,或者更好地使用最内层类中的setter或构造函数,并从activity或主控制器设置tha值。