Android - 根据SOLID原则从活动中分离异步http代码

时间:2014-09-12 10:58:02

标签: android asynchronous interface solid-principles single-responsibility-principle

我想从活动中分离异步http代码,因为我正在重用代码。这就是我目前正在做的事情:

我希望从REST API获取项目列表并将其存储在数组中。 (假设我没有使用本地缓存,因为我每次都要加载它们)

ProjectInterface.java

public interface ProjectInterface {
    public void onProjectsLoaded(ArrayList<Project> projectArrayList);
}

HttpProjectList.java

//async class will get the results from the server and send to the activity 
public class HttpProjectList {

  protected ProjectInterface interface;
  protected Context c;

  public HttpProjectList(ProjectInterface interface, Context c){
    this.interface = interface;
    this.c = c;
  }

  //Run Async task Volley here
  public void projectListRequest() {    
    RequestQueue requestQueue = Volley.newRequestQueue(this.c);
    JsonArrayRequest req = new JsonArrayRequest(Path.WORK_ORDERS, success, error);
    requestQueue.add(req);  
  }

 //on success set the data
 private Response.Listener<JSONArray> success = new Response.Listener<JSONArray>() {
    @Override
    public void onResponse(JSONArray response) {
      //do dome parsing here and populate the array
      interface.onProjectsLoaded(projectArrayList);
    }
 }

 //error function here, i'm not typing

}

MyActivity.java

//I'm calling all in this activity
public class BaseActivity extends Activity implements ProjectInterface {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(setView());

    HttpProjectList httpList = new HttpProjectList(this, getBaseContext());
    httpList.projectListRequest(); //fire http call
  }

  //run after projects loaded
  @Override
  public void onProjectsLoaded(ArrayList<Project> projectArrayList) {
     //Do something with the server data
  }

}

在这种情况下,我有一个填充数组的API。如果我有多个API呼叫怎么办? 喜欢

  1. 用户列表
  2. 承包商名单
  3. 任务列表
  4. 将新任务发布到服务器等
  5. 如何根据OOP和SOLID原则组织代码? 这些是我所掌握的技术,但我不知道哪一种是最好的。

    1. 为所有Async函数创建单独的类。根据上面的例子,我有1个接口和1个http服务处理程序类。同样,我将为每个api调用创建两组类

    2. 创建一个接口调用HttpInterface并将所有回调函数放入其中,并创建另一个HttpHandler类并放置所有API调用的所有http方法

    3. 哪一个更好?或者还有其他方法吗? 你能就此提出一些建议吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

您建议的方法都遵循Observer的模式。我个人建议第二种方法,其中所有方法都封装在一个单一的接口中。但是,如果方法的数量增加(比如说高于5),那么您可能需要考虑以可能反映对象功能的方式对它们进行分组。例如,你可能有:

public interface HttpUserListener {

    public void onUserListReceived(List<User> users);
    public void onUserAdd(User user);
    public void onUserRemove(User user);
}


public interface HttpProjectListener {

    public void onProjectListReceived(List<Project> projects);
    public void onProjectAssigned(Project project, User user);
    public void onProjectComplete(Project project);
}

在实现部分,您可能需要在特定事件上调用侦听器列表:

public class HttpHandler {

  protected List<HttpUserListener> userListeners;
  protected List<HttpProjectListener> projectListeners;
  protected Context c;

  public HttpHandler(Context c){
    this.c = c;
  }

  public void registerListener(UserListener listener){

     if(userListeners == null){

        userListeners = new ArrayList<UserListener>(1);
     }
     userListener.add(listener);
  }

  public void unregisterListener(UserListener listener){

     if(userListeners == null){
       return;
     }
     userListener.remove(listener);
  }

  public void asyncAddUser(User user){

    // provide the async method and call the listeners
    if(userListeners != null)
      for(UserListener l: userListeners)
         l.onUserAdd(user);
  }

}

我想强调,在Android中创建和处理异步任务的理想位置是服务。因此HttpHandler将扩展Service(或IntentService已经提供工作线程),您可以使用绑定方法注册和取消注册此服务的侦听器。 This是来自Android开发者网站的一个很好的教程。

或者你可以忘记传统的监听器方法,并且只有一个服务可以在HTTP调用发生时广播意图。并让您的活动捕获这些广播并做出相应的反应。这更接近Android的编程架构。