21

我正在使用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);
    }

    // ...

}

什么是使此代码干燥的好方法?

4

3 回答 3

46

您的服务的 theRestAdapter和生成的实例(MyTaskService在这种情况下)都是非常昂贵的对象,应该用作单例。

这意味着您应该只调用一次并在每次需要交互时restAdapter.create重复使用相同的实例。MyTaskService

我不能强调这一点。

您可以使用常规单例模式,以确保您在任何地方都使用这些对象的一个​​实例。依赖注入框架也可以用来管理这些实例,但如果你还没有使用它,那就有点矫枉过正了。

于 2013-12-17T05:58:32.507 回答
45

正如 Jake 所说,您应该使用单例模式以确保始终使用相同的实例。

这是一个例子:

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(...);
于 2013-12-22T01:05:46.363 回答
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

您应该至少使用 afinal static final String server= "http://10.0.2.2:8080"然后使用它,或者更好的是,在最内部的类中使用 setter 或构造函数,并从活动或主控制器设置 tha 值。

于 2013-12-16T11:21:22.127 回答