商業級專案——基金客戶端的架構設計與開發(下)(附原始碼)
#專案簡介
上一次的博文中詳細分析了基金專案的整體架構和主介面的UI設計。今天分享地方是剩下的3個頁面及相應功能的實現。
#個人中心
個人中心介面,最開始會跳轉到一個登陸介面,使用者可以通過選擇“身份證、基金賬戶、護照、戶口本“,然後輸入相應的賬號和密碼進行登陸。在這個介面中,還具有相應的記住密碼,忘記密碼功能。不輸入是不允許進入賬戶的,當正確輸入相應的賬號密碼後,通過和後臺伺服器進行驗證登陸,登陸進去之後是一個賬戶詳情頁,有持倉查詢、盈虧查詢、交易查詢等功能,在持倉查詢中hi有總資產,活期寶、今年收益的詳細資訊。在下面通過一個listview展示自己已買基金的名稱、收益率、代號等資訊。
#交易介面
#幫助介面
最後一個節目就是一個幫助介面了,這裡有訊息中心、幫助、意見反饋、關於我們。當點選撥打客服電話後,會跳轉到電話撥打介面。
#非同步任務類
我們都知道,在安卓的應用開發中,子執行緒是不能直接操作主執行緒的,所以,如果有耗時操作 又或者是密集操作,就只能放在子執行緒中去處理,但是,如果處理後的結果需要更改UI的顯示內容,這時候,就只能使用handler或AsyncTask進行處理。
AsyncTask是一個非同步任務類,可以很容易在子執行緒中處理耗時操作。裡面包含三個泛型引數params、progress、result,分別表示:
1.params:在執行asynctack時需要傳入的引數,可用於後臺任務中使用。
2.progress:後臺任務執行時,如果需要在介面上顯示當前的進度,則使用這裡指定的泛型作為進度單位。
3.result:當任務執行完畢後,如果需要對結果進行返回,則使用這裡指定的泛型作為返回值型別。
一個簡單的泛型類如下:
資料庫是一個非常重要的知識點,這裡主要是分享一個這個基金中的資料庫,這個資料庫是一個小型的輕量級的資料庫,
上一次的博文中詳細分析了基金專案的整體架構和主介面的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; } }
資料庫是一個非常重要的知識點,這裡主要是分享一個這個基金中的資料庫,這個資料庫是一個小型的輕量級的資料庫,
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
相關文章
- vue實戰 | vue移動端專案架構設計(附demo)Vue架構
- Rust中後端的清潔Clea架構原始碼專案Rust後端架構原始碼
- Flutter 仿寫的掘金客戶端Flutter客戶端
- 基於ThinkPHP開發的多商戶微信商城小程式原始碼PHP原始碼
- 《球球大作戰》原始碼解析:伺服器與客戶端架構原始碼伺服器客戶端架構
- Spring Cloud Alibaba 多租戶 saas 設計的企業開發架構SpringCloud架構
- python畢業設計專案原始碼Python原始碼
- 千萬級併發架構設計架構
- thrift原始碼分析-架構設計原始碼架構
- CodeRiver BAT企業級後端架構設計及講解(附視訊連結)BAT後端架構
- 區塊鏈眾籌專案的DAO開發組成架構(成品原始碼演示)區塊鏈架構原始碼
- 基於Vue3+TS的Monorepo前端專案架構設計與實現VueMono前端架構
- 多商戶商城開發(功能)丨多商戶商城系統開發(開發方案)丨多商戶商城成品原始碼系統原始碼
- 輕鬆開發企業級中後臺專案,順手掌握工程化的react開發架構React架構
- Vue 專案架構設計與工程化實踐Vue架構
- .NET企業級系統架構設計架構
- Springboot專案架構設計Spring Boot架構
- Dubbo架構設計與原始碼解析(三)責任鏈模式架構原始碼模式
- iOS 專案架構與程式碼規範iOS架構
- 企業應用開發和開放原始碼專案 (轉)原始碼
- 移動端基於動態路由的架構設計路由架構
- 漫談《死亡擱淺》的商業,開發與遊戲構想(下)遊戲
- 企業級大資料架構設計【2】大資料架構
- SOA架構實踐首先從企業級IT架構設計著手架構
- SaaS架構:多租戶系統架構設計架構
- 淺談基於 Laravel 開發的 MeEdu 的微服務架構設計Laravel微服務架構
- 區塊鏈應用開發方案|數字貨幣交易所繫統開發(架構設計與原始碼演示)區塊鏈架構原始碼
- 架構與設計架構
- CAS SSO單點登入客戶端環境搭建之多租戶saas企業開發架構客戶端架構
- IM開發基礎知識補課(二):如何設計大量圖片檔案的服務端儲存架構?服務端架構
- 總結一下基於 Lumen 框架的專案架構框架架構
- Java開源生鮮電商平臺-提現模組的設計與架構(原始碼可下載)Java架構原始碼
- 關於軟體專案開發的分析與設計
- 基於滴滴雲的棋牌遊戲服務端架構設計遊戲服務端架構
- IM即時通訊設計 高併發聊天服務:伺服器 + qt客戶端(附原始碼)伺服器QT客戶端原始碼
- 萬級TPS億級流水-中臺賬戶系統架構設計架構
- 架構設計之一——基礎架構架構
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端