編輯:關於Android編程
public class OutValuesController : ApiController { // GET api/values public IEnumerableGet() { return new string[] { "value1", "value2" }; } // GET api/values/5 public string Get(int id) { return "value"; } // POST api/values public void Post([FromBody]string value) { } // PUT api/values/5 public void Put(int id, [FromBody]string value) { } // DELETE api/values/5 public void Delete(int id) { } }
這種實現方式下需要繼承ApiController,這個在很多已經有很多Service的系統中難以實現,另外對controller、Service有限制。
介紹兩種利用MVC、Unity以及反射 實現的對Service的進行Restful。
第一種修改Microsoft.Web.Mvc實現;
首先利用一個Controller實現Restful,修改它的ActionInvoker來將調用攔截下來。
public class ApiHelperController : Controller { //微軟的ControllerActivator激活Controller時,執行的就是無參數的構造函數! public ApiHelperController() { base.ActionInvoker = new MyActionInvoker(); } }然後,下面比較亂了,總體就是從Controllercontext中獲取Controller、method的名稱,利用Unity根據Controller的名稱來取得實例,利用反射直接調用invoke,將result 用Json來實現。
public override bool InvokeAction(ControllerContext controllerContext, string controllerName) { //根據action名稱去找Action並執行,其中包括了 View的呈現 以及 應用在Action上的各種特性的執行 //return false; //執行失敗 // return true; //執行成功 //return base.InvokeAction(controllerContext, actionName); Type mappedType; mappedType = UnityConfig.GetConfiguredContainer().Registrations.SingleOrDefault(n => n.Name == controllerName).MappedToType; object service = UnityConfig.GetConfiguredContainer().Resolve(mappedType, new Microsoft.Practices.Unity.ResolverOverride[] { }); //object service =UnityConfig.GetTargetService(controllerName); string methodName = controllerContext.RequestContext.RouteData.GetRequiredString("id"); MethodInfo method = service.GetType().GetMethod(methodName); NameValueCollection c = controllerContext.RequestContext.HttpContext.Request.QueryString; string[] targetParams = new string[c.Count]; c.CopyTo(targetParams, 0); //得到指定方法的參數列表 ParameterInfo[] paramsInfo = method.GetParameters(); HttpResponseBase response = controllerContext.HttpContext.Response; JavaScriptSerializer serializer = new JavaScriptSerializer(); if (paramsInfo.Length != c.Count) { response.Write("參數不匹配!"); return true; } object[] finalParams = new object[c.Count]; for (int i = 0; i < c.Count; i++) { Type tType = paramsInfo[i].ParameterType; //如果它是值類型,或者String if (tType.Equals(typeof(string)) || (!tType.IsInterface && !tType.IsClass)) { //改變參數類型 finalParams[i] = Convert.ChangeType(targetParams[i], tType); } else if (tType.IsClass)//如果是類,將它的json字符串轉換成對象 { finalParams[i] = Newtonsoft.Json.JsonConvert.DeserializeObject(targetParams[i], tType); } } object data = method.Invoke(service, finalParams); response.Write(serializer.Serialize(data)); return true; }
Android:AIDL和遠程Service調用本講的內容,理解起來很難,也許你看了很多資料也看不明白,但是用起來缺簡單的要命。所以我們干脆拿一個音樂播放器中進度條的實例
關於line-height大家應該非常熟悉了吧,就是用來做垂直居中的,屢試不爽,基本上沒有什麼問題,但是最近一個項目,測試提了一個bug,看圖吧。從別處竊的圖,這個問題只
安裝Android Support Repository最低版本 minSdkVersion 18添加Uiautomator在build.gradle添加對Uiautom
先看效果圖:(以公司附近的國貿為中心點)上面是地圖,下面是地理位置列表,有的只有地理位置列表(QQ動態的位置),這是個很常見的功能。它有個專門的叫法:POI周邊搜索。實現