在重用代码时,我想将异步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调用怎么办?像
- 用户列表
- 承包商名单
- 任务列表
- 将新任务POST到服务器等
如何根据OOP和SOLID原则组织代码?这些都是我脑海中的技巧,但我不知道哪一个是最好的。
为所有异步函数创建单独的类。根据上面的例子,我有一个接口和一个http服务处理程序类。以同样的方式,我将为每个api调用创建2组类
创建一个接口调用HttpInterface并将所有回调函数放在其中,创建另一个HttpHandler类并将所有API调用的所有http方法放在其中
哪一个更好?或者还有其他办法吗?你能给我一些建议吗?非常感谢!
您建议的两种方法都遵循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
),并且您可以通过使用绑定方法向该服务注册和注销侦听器。这是安卓开发者网站上的一个很好的教程。
或者,您可以忘记传统侦听器的方法,使用一个服务,当HTTP调用发生时,该服务将广播意图。让你的活动捕捉到这些广播并做出相应的反应。这更接近安卓的编程架构。