商業級專案——基金客戶端的架構設計與開發(下)(附原始碼)

weixin_33858249發表於2016-03-14
#專案簡介
上一次的博文中詳細分析了基金專案的整體架構和主介面的UI設計。今天分享地方是剩下的3個頁面及相應功能的實現。
#個人中心
個人中心介面,最開始會跳轉到一個登陸介面,使用者可以通過選擇“身份證、基金賬戶、護照、戶口本“,然後輸入相應的賬號和密碼進行登陸。在這個介面中,還具有相應的記住密碼,忘記密碼功能。不輸入是不允許進入賬戶的,當正確輸入相應的賬號密碼後,通過和後臺伺服器進行驗證登陸,登陸進去之後是一個賬戶詳情頁,有持倉查詢、盈虧查詢、交易查詢等功能,在持倉查詢中hi有總資產,活期寶、今年收益的詳細資訊。在下面通過一個listview展示自己已買基金的名稱、收益率、代號等資訊。

#交易介面

在這個頁面中,若使用者未登入,則在該頁面最上方會提示:您還未登入”同時在右上角會有一個登陸按鈕,通過點選該按鈕可跳轉至登陸頁面。在交易頁面,有充值、快速提現、查詢等操作。

private class MySpinnerAdapter extends BaseAdapter implements SpinnerAdapter {

    @Override
    public int getCount() {
        return mListData.size();
    }

    @Override
    public Object getItem(int position) {
        return mListData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.my_simple_spinner_item_recharge, null);
        }
        TextView view = (TextView) convertView
                .findViewById(R.id.recharge_spinner_view);
        view.setText(mListData.get(position).getName());
        if (mListData.get(position).getSupport_withhold() == 1) {
            view.setEnabled(true);
        } else {
            view.setEnabled(false);
        }
        return convertView;
    }

    @Override
    public View getDropDownView(int position, View convertView,
                                ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.my_simple_spinner_dropdown_item_recharge, null);
        }
        CheckedTextView view = (CheckedTextView) convertView.findViewById(R.id.recharge_spinner_item);
        view.setText(mListData.get(position).getName());
        if (mListData.get(position).getSupport_withhold() == 1) {
            view.setEnabled(true);
            view.setCompoundDrawablesWithIntrinsicBounds(null, null,
                    getResources().getDrawable(R.drawable.icon_withhold),
                    null);
        } else {
            view.setCompoundDrawablesWithIntrinsicBounds(null, null, null,
                    null);
            view.setEnabled(false);
        }
        return convertView;
    }

}

#幫助介面
最後一個節目就是一個幫助介面了,這裡有訊息中心、幫助、意見反饋、關於我們。當點選撥打客服電話後,會跳轉到電話撥打介面。

/**
 * 獲取幫助訊息
 */
private Handler getHelpsHandler = new Handler() {
    public void handleMessage(Message msg) {
        dismissProgressDialog();
        switch (msg.what) {
            case BaseHandlerUI.TASK_NOTIFY_RETURN_DATA:
                if (msg.obj != null) {
                    try {
                        bean = (GetHelpsResultBean) msg.obj;
                        if (bean.state.equals("0")) {
                            mDatabaseAdapter.open_fund();
                            mDatabaseAdapter.deleteAllHelpsData();
                            List<TreeViewAdapter.TreeNode> treeNode = adapter.GetTreeNode();
                            treeNode.clear();
                            for (int i = 0; i < bean.list.size(); i++) {
                                mDatabaseAdapter.insertHelpsData(bean.list.get(i).ask, bean.list.get(i).reply);
                                TreeViewAdapter.TreeNode node = new TreeViewAdapter.TreeNode();
                                node.parent = bean.list.get(i).ask;
                                for (int ii = 0; ii < 1; ii++) {
                                    node.childs.add(bean.list.get(i).reply);
                                }
                                treeNode.add(node);
                            }
                            adapter.UpdateTreeNode(treeNode);
                            expandableList.setAdapter(adapter);
                            mDatabaseAdapter.close_funds();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                }
                break;
        }
    }
};


#非同步任務類
我們都知道,在安卓的應用開發中,子執行緒是不能直接操作主執行緒的,所以,如果有耗時操作 又或者是密集操作,就只能放在子執行緒中去處理,但是,如果處理後的結果需要更改UI的顯示內容,這時候,就只能使用handler或AsyncTask進行處理。

AsyncTask是一個非同步任務類,可以很容易在子執行緒中處理耗時操作。裡面包含三個泛型引數params、progress、result,分別表示:
1.params:在執行asynctack時需要傳入的引數,可用於後臺任務中使用。
2.progress:後臺任務執行時,如果需要在介面上顯示當前的進度,則使用這裡指定的泛型作為進度單位。
3.result:當任務執行完畢後,如果需要對結果進行返回,則使用這裡指定的泛型作為返回值型別。
一個簡單的泛型類如下:
<span style="font-size:18px;">class DownloadTask extends AsyncTask<Void,Integer,Boolean>{}</span>
public HttpRequestAsyncTask(HttpRequestInfo request, TaskListener listener, Context context) {

    this.context = context;
    request.putParam("device_info", ConfigUtil.getImei(context))
            .putParam("app_version", ConfigUtil.getVersionName(context))
            .putParam("market", context.getString(R.string.channel_str));
    mListener = listener;
    mRequest = request;

}

public HttpRequestAsyncTask(HttpRequestInfo request, TaskListenerWithState taskListenerWithState,
                            Context context) {
    this.context = context;
    request.putParam("device_info", ConfigUtil.getImei(context))
            .putParam("app_version", ConfigUtil.getVersionName(context))
            .putParam("market", context.getString(R.string.channel_str));
    mListenerWithState = taskListenerWithState;
    mRequest = request;
}

@Override
protected HttpResponseInfo doInBackground(Void... params) {
    if (!ConfigUtil.isConnect(context)) {
        return new HttpResponseInfo(null, HttpTaskState.STATE_NO_NETWORK_CONNECT);
    }
    try {
        if (mRequest != null) {
            if (mRequest.getRequestID() == -2) {
                return new HttpResponseInfo(
                        HttpManager.postHttpRequest(mRequest),
                        HttpTaskState.STATE_OK);
            }
            return new HttpResponseInfo(
                    HttpManager.postHttpsRequest(mRequest),
                    HttpTaskState.STATE_OK);
        }
    } catch (SocketTimeoutException e) {
        e.printStackTrace();
        return new HttpResponseInfo("{\"result\":\"3\"}", HttpTaskState.STATE_OK);
    } catch (UnknownHostException e) {
        e.printStackTrace();
        return new HttpResponseInfo("{\"result\":\"3\"}", HttpTaskState.STATE_OK);
    } catch (Exception e) {
        e.printStackTrace();
        return new HttpResponseInfo("{\"result\":\"3\"}", HttpTaskState.STATE_OK);
    }
    return null;
}


#HTTP程式設計

Http程式設計有請求和響應,這裡我們把對json資料年度解析放到這一部分來講解:

/**
 * Http 請求
 */
public class HttpRequestInfo {

    public static final String TAG = "HttpRequestInfo";

    /* Http 請求的 URL */
    private String requestUrl;
    private int requestID;
    private Map<String, String> requestParams;

    public HttpRequestInfo(String url) {
        this.setRequestUrl(url);
        requestParams = new HashMap<String, String>();
    }

    public HttpRequestInfo(String url, Map<String, String> params) {
        this.setRequestUrl(url);
        this.setRequestParams(params);
    }

    public String getRequestUrl() {
        return requestUrl;
    }

    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }

    public Map<String, String> getRequestParams() {
        return requestParams;
    }

    public void setRequestParams(Map<String, String> requestParams) {
        this.requestParams = requestParams;
    }

    public String getParamsStr() {
        String str = "";
        if (requestParams != null) {
            for (Entry<String, String> entry : requestParams.entrySet()) {
                String key = entry.getKey();
                String val = entry.getValue();
                key = URLEncoder.encode(key);
                val = URLEncoder.encode(val);
                str += key + "=" + val + "&";
            }
        }
        if (str.equals("")) {
            return null;
        }
        LogUtil.i(TAG, this.requestUrl + str);
        return str;
    }

    public HttpRequestInfo putParam(String key, String value) {
        this.requestParams.put(key, value);
        return this;
    }

    public int getRequestID() {
        return requestID;
    }

    public void setRequestID(int requestID) {
        this.requestID = requestID;
    }
}
對於響應:

/**
 * Http 響應
 */
public class HttpResponseInfo {
    public enum HttpTaskState {
        STATE_OK,
        STATE_NO_NETWORK_CONNECT,
        STATE_TIME_OUT,
        STATE_UNKNOWN,
    }

    public HttpResponseInfo(String result, HttpTaskState state) {
        this.result = result;
        this.state = state;
    }

    private HttpTaskState state;
    private String result;

    public HttpTaskState getState() {
        return state;
    }

    public void setState(HttpTaskState state) {
        this.state = state;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

}



#SqLite程式設計
資料庫是一個非常重要的知識點,這裡主要是分享一個這個基金中的資料庫,這個資料庫是一個小型的輕量級的資料庫,

SQLiteOpenHelper有onCreate()、onUpgrade()兩個方法。

private static class DatabaseHelper extends SQLiteOpenHelper {

    public DatabaseHelper(Context context, String name,
                          CursorFactory factory, int version) {
        super(context, DB_NAME, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //建立所有資料庫表
        db.execSQL(DB_CREATE_FUND);
        db.execSQL(DB_CREATE_FAV_FUND);
        db.execSQL(DB_CREATE_HELPS_INFO);
        db.execSQL(DB_CREATE_FUND_DETAIL);
        db.execSQL(DB_CREATE_MSG);
    }

    // 更新基金資料
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion,
                          int newVersion) {

        db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_FUND);
        db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_FAV_FUND);
        db.execSQL("DROP TABLE IF EXISTS " + DB_CREATE_HELPS_INFO);
        db.execSQL("DROP TABLE IF EXISTS " + DB_CREATE_FUND_DETAIL);
        db.execSQL("DROP TABLE IF EXISTS " + DB_CREATE_MSG);

        onCreate(db);
    }
}

當然了,僅僅通過一篇博文是不可逆完全完整的說完整個專案了,這裡寫的僅僅是冰山一角,更多的內容還是希望讀者自己去發現並學到裡面的精華部分!當然咯,我相信有一部分人讀了也基本上沒看懂我寫的是什麼,那麼請下載原始碼看看,互相學習咯!


原始碼下載地址:http://download.csdn.net/detail/sdksdk0/9461193


相關文章