編輯:關於Android編程
public class OutValuesController : ApiController
{
// GET api/values
public IEnumerable Get()
{
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調用示例代碼
Android:AIDL和遠程Service調用本講的內容,理解起來很難,也許你看了很多資料也看不明白,但是用起來缺簡單的要命。所以我們干脆拿一個音樂播放器中進度條的實例
android上line-height的問題
關於line-height大家應該非常熟悉了吧,就是用來做垂直居中的,屢試不爽,基本上沒有什麼問題,但是最近一個項目,測試提了一個bug,看圖吧。從別處竊的圖,這個問題只
android studio測試--Uiautomator
安裝Android Support Repository最低版本 minSdkVersion 18添加Uiautomator在build.gradle添加對Uiautom
Android實現帶列表的地圖POI周邊搜索功能
先看效果圖:(以公司附近的國貿為中心點)上面是地圖,下面是地理位置列表,有的只有地理位置列表(QQ動態的位置),這是個很常見的功能。它有個專門的叫法:POI周邊搜索。實現