遠離過度設計:Android專案最適用的架構

thekey_發表於2015-11-10


 前段時間看了幾篇MVP在android上的應用,大多數的思路都是一樣的。MVP與MVC最不同的一點是M與V是不直接關聯的也是就Model與View不存在直接關係,這兩者之間間隔著的是Presenter層,通過Presenter來處理MV之間的關係。但是同樣的這麼做也會導致很多重複的程式碼,迭代容易寫起來真是惱火不解釋。

不喜歡這種設計,但是想法總是要有的,於是我這樣做了;

我們通常情況下的一個帶有列表的介面(listview,gridview,recyclerview,xxView)但凡是需要從網路載入資料的都有以下幾個特點:

1.URL(api地址)

2.Params(引數)

3.回撥

我們的Activity往往都只需要接受或者傳入這些值來控制

    @Override
    public String getApiUrl() {
        return url;
    }

    @Override
    public RequestParams getParams() {
        return params;
    }

    @Override
    public Class getClazz() {
     
    }

    @Override
    public void Onsuccess(Object o) {
       
    }

    @Override
    public void Onfailure(String msg) {
        T.showShort(this, msg);
    }

在Acvtivity中,我只需要這幾個方法就可以搞定,開一個BaseListActivity在裡邊實現網路訪問就可以了,之後的activity完全不用管這個list中如何去獲取資料的,接受的永遠只是一個物件而已。


例項:

public abstract class BaseListActivity<T> extends BaseActivity implements HttpRequstParams<T> {

    private RequestQueue mRequestQueue;
    private static final String HTTP_TAG = "tag";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mRequestQueue = Volley.newRequestQueue(this);
        LoadingData();
    }

    /**
     * 獲取列表
     */
    private void LoadingData() {
        StringRequest request = new StringRequest(Request.Method.POST, getApiUrl(), new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Gson gson = new Gson();
                T t = (T) gson.fromJson(response,getClazz());
                Onsuccess(t);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                Onfailure("獲取資料失敗");
            }
        });
        request.setRequestParams(getParams());
        request.setTag(HTTP_TAG);
        mRequestQueue.add(request);
    }

    /**
     * 結束網路訪問請求
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRequestQueue.cancelAll(HTTP_TAG);
    }
}

public interface HttpRequstParams<T> {

    /**
     * 獲取網路訪問的地址
     *
     * @return
     */
    String getApiUrl();

    /**
     * 獲取引數
     *
     * @return
     */
    RequestParams getParams();

    /**
     * 獲取位元組碼
     *
     * @return
     */
    Class getClazz();

    /**
     * 成功
     **/
    void  Onsuccess(T t);

    /**
     * 失敗
     **/
    void Onfailure(String msg);

}

public class TestActivity extends BaseListActivity {

    @InjectView(R.id.listView)
    ListView listView;
 
    @Override
    protected void initLayoutAndView() {
        setContentView(R.layout.activity_app_store);
    }

    @Override
    protected void addListener() {

    }

    @Override
    public String getApiUrl() {
        return API.APP.APPLIST;
    }

    @Override
    public RequestParams getParams() {
        RequestParams params = new RequestParams();
        params.addBodyParameter("", "");
		.....
        return params;
    }

    @Override
    public Class getClazz() {
        return xx.class;
    }

    @Override
    public void Onsuccess(Object o) {
			
    }

    @Override
    public void Onfailure(String msg) {
        T.showShort(this, msg);
    }
}



這種方式配合快速adapter使用,程式碼就這麼多。輕鬆加愉快吧!




相關文章