2014-09-12 14 views
0

我想要重複使用代碼中的異步http代碼。這是我目前正在做的:Android - 根據SOLID原則從活動中分離異步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. 發佈一個新的任務到服務器等

我怎樣才能根據OOP和SOLID原則組織代碼? 這些是我心中的技巧,但我不知道哪一個是最好的。

  1. 爲所有異步函數創建單獨的類。根據上面的例子,我有1個接口和1個http服務處理程序類。以同樣的方式,我將爲每個api調用創建2套類

  2. 創建一個接口調用HttpInterface並將所有回調函數放入其中,並創建另一個HttpHandler類並將所有http方法API調用

哪一個更好?或者還有其他方法嗎? 你能提供一些建議嗎?非常感謝!

回答

1

你所建議的方法都遵循觀察者模式。我個人會建議第二種方法,將所有方法封裝在一個單一界面中。但是,如果方法的數量增加(比方說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的編程架構。